language: php
php:
- - hhvm
- - 5.3
- - 5.4
- - 5.5
- - 5.6
-
-matrix:
- allow_failures:
- - php: 5.3
- - php: 5.4
- - php: 5.5
- - php: 5.6
+ - hhvm-nightly
services:
- mysql
before_install:
- sudo apt-get install -qq djvulibre-bin tidy
+ - composer self-update --quiet --no-interaction
before_script:
- # Initialise submodules, in case we're testing a Wikimedia production branch.
- - git submodule update --init --recursive
- # Travis CI's HHVM environment provides PHPUnit as a phar file, but
- # MediaWiki's test suite only works if individual PHPUnit files are
- # actual files on disk (bug 58881).
- - composer require 'phpunit/phpunit=3.7.*' --prefer-source
+ - composer install --prefer-source --quiet --no-interaction
- >
- php maintenance/install.php testwiki admin
+ php maintenance/install.php traviswiki admin
--pass travis
--dbname traviswiki
--dbuser travis
--scriptpath "/w"
script:
- - >
- if [ "$TRAVIS_PHP_VERSION" = "hhvm" ];
- then
- hhvm --php \
- -d include_path=".$(printf ':%s' vendor/phpunit/*)" \
- -d date.timezone="Etc/UTC" \
- tests/phpunit/phpunit.php
- else
- php tests/phpunit/phpunit.php \
- --with-phpunitdir ./vendor/phpunit/phpunit
- fi
+ - php tests/phpunit/phpunit.php
+
+notifications:
+ irc:
+ channels:
+ - "chat.freenode.net#mediawiki-core"
+ on_success: change
+ on_failure: change
+ skip_join: true
* $wgDBClusterTimeout has been removed.
* $wgProxyKey has been removed. It is no longer used by MediaWiki core.
Ensure $wgSecretKey is set in LocalSettings.php.
+* $wgExtraInterlanguageLinkPrefixes is a new configuration variable that
+ contains an array of interwiki prefixes that should be treated as language
+ prefixes (i.e. turned into interlanguage links when $wgInterwikiMagic is set
+ to true).
=== New features in 1.24 ===
* Added a new hook, "WhatLinksHereProps", to allow extensions to annotate
* Skins can now use 'remoteSkinPath' when defining ResourceLoader modules.
This works the same as 'remoteExtPath' but is relative to the skins/ folder
instead of the extensions/ folder.
+* Extensions and skins may now use 'namemsg' in $wgExtensionCredits in addition
+ to 'name', to allow for the name to be localizable. 'name' should still be
+ specified for backwards-compatibility and to define the path Special:Version
+ uses to find extension license information.
=== Bug fixes in 1.24 ===
* (bug 49116) Footer copyright notice is now always displayed in user language
* (bug 52587) Maintenance script deleteBatch.php no longer follows redirects
in the file namespace and delete the file on the target page. It will still
however delete the redirect page.
+* (bug 22683) {{msgnw:}} and other uses of PPFrame::RECOVER_ORIG will correctly
+ recover the original code of extension tags.
=== Web API changes in 1.24 ===
* action=parse API now supports prop=modules, which provides the list of
for migration guide for creators and users of custom skins that relied on it.
* ResourceLoaderFileModule#getAllStyleFiles now returns all style files and all
skin style files used by the module.
+* Removed getLang() from IContextSource and subclasses. (deprecated since 1.19)
+* Removed setLang() from subclasses of IContextSource. (deprecated since 1.19)
+* Removed WebRequest::escapeAppendQuery(). (deprecated since 1.20)
+* Removed info(), purge(), revert() and rollback() from the Article class; they
+ have since become subclasses of the Action class. (deprecated since 1.19)
==== Renamed classes ====
* CLDRPluralRuleConverter_Expression to CLDRPluralRuleConverterExpression
* CLDRPluralRuleEvaluator_Range to CLDRPluralRuleEvaluatorRange
* CSSJanus_Tokenizer to CSSJanusTokenizer
* MediaWiki_I18N to MediaWikiI18N
+* Parser_DiffTest to ParserDiffTest
* RevDel_ArchiveItem to RevDelArchiveItem
* RevDel_ArchiveList to RevDelArchiveList
* RevDel_ArchivedFileItem to RevDelArchivedFileItem
contents of $error to be echoed at the top of the edit form as wikitext.
Return true without altering $error to allow the edit to proceed.
-'EditPage::showReadOnlyForm:initial: similar to EditPage::showEditForm:initial
-but for the readonly 'view source' variant of the edit form.
+'EditPage::showReadOnlyForm:initial': similar to EditPage::showEditForm:initial
+but for the read-only 'view source' variant of the edit form.
$editor: EditPage instance (object)
&$out: an OutputPage instance to write to
-return value is ignored (should alway return true)
+return value is ignored (should always return true)
'EditPage::showStandardInputs:options': allows injection of form fields into
the editOptions area
$out: OutputPage object
'RawPageViewBeforeOutput': Right before the text is blown out in action=raw.
-&$obj: RawPage object
+&$obj: RawAction object
&$text: The text that's going to be the output
'RecentChange_save': Called at the end of RecentChange::save().
+++ /dev/null
-<?php
-/**
- * User interface for page actions.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Class for viewing MediaWiki article and history.
- *
- * This maintains WikiPage functions for backwards compatibility.
- *
- * @todo Move and rewrite code to an Action class
- *
- * See design.txt for an overview.
- * Note: edit user interface and cache support functions have been
- * moved to separate EditPage and HTMLFileCache classes.
- *
- * @internal documentation reviewed 15 Mar 2010
- */
-class Article implements Page {
- /** @var IContextSource The context this Article is executed in */
- protected $mContext;
-
- /** @var WikiPage The WikiPage object of this instance */
- protected $mPage;
-
- /** @var ParserOptions ParserOptions object for $wgUser articles */
- public $mParserOptions;
-
- /**
- * @var string Text of the revision we are working on
- * @todo BC cruft
- */
- public $mContent;
-
- /**
- * @var Content Content of the revision we are working on
- * @since 1.21
- */
- protected $mContentObject;
-
- /** @var bool Is the content ($mContent) already loaded? */
- protected $mContentLoaded = false;
-
- /** @var int|null The oldid of the article that is to be shown, 0 for the current revision */
- protected $mOldId;
-
- /** @var Title Title from which we were redirected here */
- protected $mRedirectedFrom = null;
-
- /** @var string|bool URL to redirect to or false if none */
- protected $mRedirectUrl = false;
-
- /** @var int Revision ID of revision we are working on */
- protected $mRevIdFetched = 0;
-
- /** @var Revision Revision we are working on */
- protected $mRevision = null;
-
- /** @var ParserOutput */
- public $mParserOutput;
-
- /**
- * Constructor and clear the article
- * @param Title $title Reference to a Title object.
- * @param int $oldId Revision ID, null to fetch from request, zero for current
- */
- public function __construct( Title $title, $oldId = null ) {
- $this->mOldId = $oldId;
- $this->mPage = $this->newPage( $title );
- }
-
- /**
- * @param Title $title
- * @return WikiPage
- */
- protected function newPage( Title $title ) {
- return new WikiPage( $title );
- }
-
- /**
- * Constructor from a page id
- * @param int $id Article ID to load
- * @return Article|null
- */
- public static function newFromID( $id ) {
- $t = Title::newFromID( $id );
- # @todo FIXME: Doesn't inherit right
- return $t == null ? null : new self( $t );
- # return $t == null ? null : new static( $t ); // PHP 5.3
- }
-
- /**
- * Create an Article object of the appropriate class for the given page.
- *
- * @param Title $title
- * @param IContextSource $context
- * @return Article
- */
- public static function newFromTitle( $title, IContextSource $context ) {
- if ( NS_MEDIA == $title->getNamespace() ) {
- // FIXME: where should this go?
- $title = Title::makeTitle( NS_FILE, $title->getDBkey() );
- }
-
- $page = null;
- wfRunHooks( 'ArticleFromTitle', array( &$title, &$page, $context ) );
- if ( !$page ) {
- switch ( $title->getNamespace() ) {
- case NS_FILE:
- $page = new ImagePage( $title );
- break;
- case NS_CATEGORY:
- $page = new CategoryPage( $title );
- break;
- default:
- $page = new Article( $title );
- }
- }
- $page->setContext( $context );
-
- return $page;
- }
-
- /**
- * Create an Article object of the appropriate class for the given page.
- *
- * @param WikiPage $page
- * @param IContextSource $context
- * @return Article
- */
- public static function newFromWikiPage( WikiPage $page, IContextSource $context ) {
- $article = self::newFromTitle( $page->getTitle(), $context );
- $article->mPage = $page; // override to keep process cached vars
- return $article;
- }
-
- /**
- * Tell the page view functions that this view was redirected
- * from another page on the wiki.
- * @param Title $from
- */
- public function setRedirectedFrom( Title $from ) {
- $this->mRedirectedFrom = $from;
- }
-
- /**
- * Get the title object of the article
- *
- * @return Title Title object of this page
- */
- public function getTitle() {
- return $this->mPage->getTitle();
- }
-
- /**
- * Get the WikiPage object of this instance
- *
- * @since 1.19
- * @return WikiPage
- */
- public function getPage() {
- return $this->mPage;
- }
-
- /**
- * Clear the object
- */
- public function clear() {
- $this->mContentLoaded = false;
-
- $this->mRedirectedFrom = null; # Title object if set
- $this->mRevIdFetched = 0;
- $this->mRedirectUrl = false;
-
- $this->mPage->clear();
- }
-
- /**
- * Note that getContent/loadContent do not follow redirects anymore.
- * If you need to fetch redirectable content easily, try
- * the shortcut in WikiPage::getRedirectTarget()
- *
- * This function has side effects! Do not use this function if you
- * only want the real revision text if any.
- *
- * @deprecated since 1.21; use WikiPage::getContent() instead
- *
- * @return string Return the text of this revision
- */
- public function getContent() {
- ContentHandler::deprecated( __METHOD__, '1.21' );
- $content = $this->getContentObject();
- return ContentHandler::getContentText( $content );
- }
-
- /**
- * Returns a Content object representing the pages effective display content,
- * not necessarily the revision's content!
- *
- * Note that getContent/loadContent do not follow redirects anymore.
- * If you need to fetch redirectable content easily, try
- * the shortcut in WikiPage::getRedirectTarget()
- *
- * This function has side effects! Do not use this function if you
- * only want the real revision text if any.
- *
- * @return Content Return the content of this revision
- *
- * @since 1.21
- */
- protected function getContentObject() {
- wfProfileIn( __METHOD__ );
-
- if ( $this->mPage->getID() === 0 ) {
- # If this is a MediaWiki:x message, then load the messages
- # and return the message value for x.
- if ( $this->getTitle()->getNamespace() == NS_MEDIAWIKI ) {
- $text = $this->getTitle()->getDefaultMessageText();
- if ( $text === false ) {
- $text = '';
- }
-
- $content = ContentHandler::makeContent( $text, $this->getTitle() );
- } else {
- $message = $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon';
- $content = new MessageContent( $message, null, 'parsemag' );
- }
- } else {
- $this->fetchContentObject();
- $content = $this->mContentObject;
- }
-
- wfProfileOut( __METHOD__ );
- return $content;
- }
-
- /**
- * @return int The oldid of the article that is to be shown, 0 for the current revision
- */
- public function getOldID() {
- if ( is_null( $this->mOldId ) ) {
- $this->mOldId = $this->getOldIDFromRequest();
- }
-
- return $this->mOldId;
- }
-
- /**
- * Sets $this->mRedirectUrl to a correct URL if the query parameters are incorrect
- *
- * @return int The old id for the request
- */
- public function getOldIDFromRequest() {
- $this->mRedirectUrl = false;
-
- $request = $this->getContext()->getRequest();
- $oldid = $request->getIntOrNull( 'oldid' );
-
- if ( $oldid === null ) {
- return 0;
- }
-
- if ( $oldid !== 0 ) {
- # Load the given revision and check whether the page is another one.
- # In that case, update this instance to reflect the change.
- if ( $oldid === $this->mPage->getLatest() ) {
- $this->mRevision = $this->mPage->getRevision();
- } else {
- $this->mRevision = Revision::newFromId( $oldid );
- if ( $this->mRevision !== null ) {
- // Revision title doesn't match the page title given?
- if ( $this->mPage->getID() != $this->mRevision->getPage() ) {
- $function = array( get_class( $this->mPage ), 'newFromID' );
- $this->mPage = call_user_func( $function, $this->mRevision->getPage() );
- }
- }
- }
- }
-
- if ( $request->getVal( 'direction' ) == 'next' ) {
- $nextid = $this->getTitle()->getNextRevisionID( $oldid );
- if ( $nextid ) {
- $oldid = $nextid;
- $this->mRevision = null;
- } else {
- $this->mRedirectUrl = $this->getTitle()->getFullURL( 'redirect=no' );
- }
- } elseif ( $request->getVal( 'direction' ) == 'prev' ) {
- $previd = $this->getTitle()->getPreviousRevisionID( $oldid );
- if ( $previd ) {
- $oldid = $previd;
- $this->mRevision = null;
- }
- }
-
- return $oldid;
- }
-
- /**
- * Load the revision (including text) into this object
- *
- * @deprecated since 1.19; use fetchContent()
- */
- function loadContent() {
- wfDeprecated( __METHOD__, '1.19' );
- $this->fetchContent();
- }
-
- /**
- * Get text of an article from database
- * Does *NOT* follow redirects.
- *
- * @protected
- * @note This is really internal functionality that should really NOT be
- * used by other functions. For accessing article content, use the WikiPage
- * class, especially WikiBase::getContent(). However, a lot of legacy code
- * uses this method to retrieve page text from the database, so the function
- * has to remain public for now.
- *
- * @return string|bool String containing article contents, or false if null
- * @deprecated since 1.21, use WikiPage::getContent() instead
- */
- function fetchContent() { #BC cruft!
- ContentHandler::deprecated( __METHOD__, '1.21' );
-
- if ( $this->mContentLoaded && $this->mContent ) {
- return $this->mContent;
- }
-
- wfProfileIn( __METHOD__ );
-
- $content = $this->fetchContentObject();
-
- if ( !$content ) {
- wfProfileOut( __METHOD__ );
- return false;
- }
-
- // @todo Get rid of mContent everywhere!
- $this->mContent = ContentHandler::getContentText( $content );
- ContentHandler::runLegacyHooks( 'ArticleAfterFetchContent', array( &$this, &$this->mContent ) );
-
- wfProfileOut( __METHOD__ );
-
- return $this->mContent;
- }
-
- /**
- * Get text content object
- * Does *NOT* follow redirects.
- * @todo When is this null?
- *
- * @note Code that wants to retrieve page content from the database should
- * use WikiPage::getContent().
- *
- * @return Content|null|bool
- *
- * @since 1.21
- */
- protected function fetchContentObject() {
- if ( $this->mContentLoaded ) {
- return $this->mContentObject;
- }
-
- wfProfileIn( __METHOD__ );
-
- $this->mContentLoaded = true;
- $this->mContent = null;
-
- $oldid = $this->getOldID();
-
- # Pre-fill content with error message so that if something
- # fails we'll have something telling us what we intended.
- //XXX: this isn't page content but a UI message. horrible.
- $this->mContentObject = new MessageContent( 'missing-revision', array( $oldid ), array() );
-
- if ( $oldid ) {
- # $this->mRevision might already be fetched by getOldIDFromRequest()
- if ( !$this->mRevision ) {
- $this->mRevision = Revision::newFromId( $oldid );
- if ( !$this->mRevision ) {
- wfDebug( __METHOD__ . " failed to retrieve specified revision, id $oldid\n" );
- wfProfileOut( __METHOD__ );
- return false;
- }
- }
- } else {
- if ( !$this->mPage->getLatest() ) {
- wfDebug( __METHOD__ . " failed to find page data for title " .
- $this->getTitle()->getPrefixedText() . "\n" );
- wfProfileOut( __METHOD__ );
- return false;
- }
-
- $this->mRevision = $this->mPage->getRevision();
-
- if ( !$this->mRevision ) {
- wfDebug( __METHOD__ . " failed to retrieve current page, rev_id " .
- $this->mPage->getLatest() . "\n" );
- wfProfileOut( __METHOD__ );
- return false;
- }
- }
-
- // @todo FIXME: Horrible, horrible! This content-loading interface just plain sucks.
- // We should instead work with the Revision object when we need it...
- // Loads if user is allowed
- $this->mContentObject = $this->mRevision->getContent(
- Revision::FOR_THIS_USER,
- $this->getContext()->getUser()
- );
- $this->mRevIdFetched = $this->mRevision->getId();
-
- wfRunHooks( 'ArticleAfterFetchContentObject', array( &$this, &$this->mContentObject ) );
-
- wfProfileOut( __METHOD__ );
-
- return $this->mContentObject;
- }
-
- /**
- * Returns true if the currently-referenced revision is the current edit
- * to this page (and it exists).
- * @return bool
- */
- public function isCurrent() {
- # If no oldid, this is the current version.
- if ( $this->getOldID() == 0 ) {
- return true;
- }
-
- return $this->mPage->exists() && $this->mRevision && $this->mRevision->isCurrent();
- }
-
- /**
- * Get the fetched Revision object depending on request parameters or null
- * on failure.
- *
- * @since 1.19
- * @return Revision|null
- */
- public function getRevisionFetched() {
- $this->fetchContentObject();
-
- return $this->mRevision;
- }
-
- /**
- * Use this to fetch the rev ID used on page views
- *
- * @return int Revision ID of last article revision
- */
- public function getRevIdFetched() {
- if ( $this->mRevIdFetched ) {
- return $this->mRevIdFetched;
- } else {
- return $this->mPage->getLatest();
- }
- }
-
- /**
- * This is the default action of the index.php entry point: just view the
- * page of the given title.
- */
- public function view() {
- global $wgUseFileCache, $wgUseETag, $wgDebugToolbar;
-
- wfProfileIn( __METHOD__ );
-
- # Get variables from query string
- # As side effect this will load the revision and update the title
- # in a revision ID is passed in the request, so this should remain
- # the first call of this method even if $oldid is used way below.
- $oldid = $this->getOldID();
-
- $user = $this->getContext()->getUser();
- # Another whitelist check in case getOldID() is altering the title
- $permErrors = $this->getTitle()->getUserPermissionsErrors( 'read', $user );
- if ( count( $permErrors ) ) {
- wfDebug( __METHOD__ . ": denied on secondary read check\n" );
- wfProfileOut( __METHOD__ );
- throw new PermissionsError( 'read', $permErrors );
- }
-
- $outputPage = $this->getContext()->getOutput();
- # getOldID() may as well want us to redirect somewhere else
- if ( $this->mRedirectUrl ) {
- $outputPage->redirect( $this->mRedirectUrl );
- wfDebug( __METHOD__ . ": redirecting due to oldid\n" );
- wfProfileOut( __METHOD__ );
-
- return;
- }
-
- # If we got diff in the query, we want to see a diff page instead of the article.
- if ( $this->getContext()->getRequest()->getCheck( 'diff' ) ) {
- wfDebug( __METHOD__ . ": showing diff page\n" );
- $this->showDiffPage();
- wfProfileOut( __METHOD__ );
-
- return;
- }
-
- # Set page title (may be overridden by DISPLAYTITLE)
- $outputPage->setPageTitle( $this->getTitle()->getPrefixedText() );
-
- $outputPage->setArticleFlag( true );
- # Allow frames by default
- $outputPage->allowClickjacking();
-
- $parserCache = ParserCache::singleton();
-
- $parserOptions = $this->getParserOptions();
- # Render printable version, use printable version cache
- if ( $outputPage->isPrintable() ) {
- $parserOptions->setIsPrintable( true );
- $parserOptions->setEditSection( false );
- } elseif ( !$this->isCurrent() || !$this->getTitle()->quickUserCan( 'edit', $user ) ) {
- $parserOptions->setEditSection( false );
- }
-
- # Try client and file cache
- if ( !$wgDebugToolbar && $oldid === 0 && $this->mPage->checkTouched() ) {
- if ( $wgUseETag ) {
- $outputPage->setETag( $parserCache->getETag( $this, $parserOptions ) );
- }
-
- # Is it client cached?
- if ( $outputPage->checkLastModified( $this->mPage->getTouched() ) ) {
- wfDebug( __METHOD__ . ": done 304\n" );
- wfProfileOut( __METHOD__ );
-
- return;
- # Try file cache
- } elseif ( $wgUseFileCache && $this->tryFileCache() ) {
- wfDebug( __METHOD__ . ": done file cache\n" );
- # tell wgOut that output is taken care of
- $outputPage->disable();
- $this->mPage->doViewUpdates( $user, $oldid );
- wfProfileOut( __METHOD__ );
-
- return;
- }
- }
-
- # Should the parser cache be used?
- $useParserCache = $this->mPage->isParserCacheUsed( $parserOptions, $oldid );
- wfDebug( 'Article::view using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
- if ( $user->getStubThreshold() ) {
- wfIncrStats( 'pcache_miss_stub' );
- }
-
- $this->showRedirectedFromHeader();
- $this->showNamespaceHeader();
-
- # Iterate through the possible ways of constructing the output text.
- # Keep going until $outputDone is set, or we run out of things to do.
- $pass = 0;
- $outputDone = false;
- $this->mParserOutput = false;
-
- while ( !$outputDone && ++$pass ) {
- switch ( $pass ) {
- case 1:
- wfRunHooks( 'ArticleViewHeader', array( &$this, &$outputDone, &$useParserCache ) );
- break;
- case 2:
- # Early abort if the page doesn't exist
- if ( !$this->mPage->exists() ) {
- wfDebug( __METHOD__ . ": showing missing article\n" );
- $this->showMissingArticle();
- $this->mPage->doViewUpdates( $user );
- wfProfileOut( __METHOD__ );
- return;
- }
-
- # Try the parser cache
- if ( $useParserCache ) {
- $this->mParserOutput = $parserCache->get( $this, $parserOptions );
-
- if ( $this->mParserOutput !== false ) {
- if ( $oldid ) {
- wfDebug( __METHOD__ . ": showing parser cache contents for current rev permalink\n" );
- $this->setOldSubtitle( $oldid );
- } else {
- wfDebug( __METHOD__ . ": showing parser cache contents\n" );
- }
- $outputPage->addParserOutput( $this->mParserOutput );
- # Ensure that UI elements requiring revision ID have
- # the correct version information.
- $outputPage->setRevisionId( $this->mPage->getLatest() );
- # Preload timestamp to avoid a DB hit
- $cachedTimestamp = $this->mParserOutput->getTimestamp();
- if ( $cachedTimestamp !== null ) {
- $outputPage->setRevisionTimestamp( $cachedTimestamp );
- $this->mPage->setTimestamp( $cachedTimestamp );
- }
- $outputDone = true;
- }
- }
- break;
- case 3:
- # This will set $this->mRevision if needed
- $this->fetchContentObject();
-
- # Are we looking at an old revision
- if ( $oldid && $this->mRevision ) {
- $this->setOldSubtitle( $oldid );
-
- if ( !$this->showDeletedRevisionHeader() ) {
- wfDebug( __METHOD__ . ": cannot view deleted revision\n" );
- wfProfileOut( __METHOD__ );
- return;
- }
- }
-
- # Ensure that UI elements requiring revision ID have
- # the correct version information.
- $outputPage->setRevisionId( $this->getRevIdFetched() );
- # Preload timestamp to avoid a DB hit
- $outputPage->setRevisionTimestamp( $this->getTimestamp() );
-
- # Pages containing custom CSS or JavaScript get special treatment
- if ( $this->getTitle()->isCssOrJsPage() || $this->getTitle()->isCssJsSubpage() ) {
- wfDebug( __METHOD__ . ": showing CSS/JS source\n" );
- $this->showCssOrJsPage();
- $outputDone = true;
- } elseif ( !wfRunHooks( 'ArticleContentViewCustom',
- array( $this->fetchContentObject(), $this->getTitle(), $outputPage ) ) ) {
-
- # Allow extensions do their own custom view for certain pages
- $outputDone = true;
- } elseif ( !ContentHandler::runLegacyHooks( 'ArticleViewCustom',
- array( $this->fetchContentObject(), $this->getTitle(), $outputPage ) ) ) {
-
- # Allow extensions do their own custom view for certain pages
- $outputDone = true;
- }
- break;
- case 4:
- # Run the parse, protected by a pool counter
- wfDebug( __METHOD__ . ": doing uncached parse\n" );
-
- $content = $this->getContentObject();
- $poolArticleView = new PoolWorkArticleView( $this->getPage(), $parserOptions,
- $this->getRevIdFetched(), $useParserCache, $content );
-
- if ( !$poolArticleView->execute() ) {
- $error = $poolArticleView->getError();
- if ( $error ) {
- $outputPage->clearHTML(); // for release() errors
- $outputPage->enableClientCache( false );
- $outputPage->setRobotPolicy( 'noindex,nofollow' );
-
- $errortext = $error->getWikiText( false, 'view-pool-error' );
- $outputPage->addWikiText( '<div class="errorbox">' . $errortext . '</div>' );
- }
- # Connection or timeout error
- wfProfileOut( __METHOD__ );
- return;
- }
-
- $this->mParserOutput = $poolArticleView->getParserOutput();
- $outputPage->addParserOutput( $this->mParserOutput );
- if ( $content->getRedirectTarget() ) {
- $outputPage->addSubtitle( wfMessage( 'redirectpagesub' )->parse() );
- }
-
- # Don't cache a dirty ParserOutput object
- if ( $poolArticleView->getIsDirty() ) {
- $outputPage->setSquidMaxage( 0 );
- $outputPage->addHTML( "<!-- parser cache is expired, " .
- "sending anyway due to pool overload-->\n" );
- }
-
- $outputDone = true;
- break;
- # Should be unreachable, but just in case...
- default:
- break 2;
- }
- }
-
- # Get the ParserOutput actually *displayed* here.
- # Note that $this->mParserOutput is the *current* version output.
- $pOutput = ( $outputDone instanceof ParserOutput )
- ? $outputDone // object fetched by hook
- : $this->mParserOutput;
-
- # Adjust title for main page & pages with displaytitle
- if ( $pOutput ) {
- $this->adjustDisplayTitle( $pOutput );
- }
-
- # For the main page, overwrite the <title> element with the con-
- # tents of 'pagetitle-view-mainpage' instead of the default (if
- # that's not empty).
- # This message always exists because it is in the i18n files
- if ( $this->getTitle()->isMainPage() ) {
- $msg = wfMessage( 'pagetitle-view-mainpage' )->inContentLanguage();
- if ( !$msg->isDisabled() ) {
- $outputPage->setHTMLTitle( $msg->title( $this->getTitle() )->text() );
- }
- }
-
- # Check for any __NOINDEX__ tags on the page using $pOutput
- $policy = $this->getRobotPolicy( 'view', $pOutput );
- $outputPage->setIndexPolicy( $policy['index'] );
- $outputPage->setFollowPolicy( $policy['follow'] );
-
- $this->showViewFooter();
- $this->mPage->doViewUpdates( $user, $oldid );
-
- $outputPage->addModules( 'mediawiki.action.view.postEdit' );
-
- wfProfileOut( __METHOD__ );
- }
-
- /**
- * Adjust title for pages with displaytitle, -{T|}- or language conversion
- * @param ParserOutput $pOutput
- */
- public function adjustDisplayTitle( ParserOutput $pOutput ) {
- # Adjust the title if it was set by displaytitle, -{T|}- or language conversion
- $titleText = $pOutput->getTitleText();
- if ( strval( $titleText ) !== '' ) {
- $this->getContext()->getOutput()->setPageTitle( $titleText );
- }
- }
-
- /**
- * Show a diff page according to current request variables. For use within
- * Article::view() only, other callers should use the DifferenceEngine class.
- *
- * @todo Make protected
- */
- public function showDiffPage() {
- $request = $this->getContext()->getRequest();
- $user = $this->getContext()->getUser();
- $diff = $request->getVal( 'diff' );
- $rcid = $request->getVal( 'rcid' );
- $diffOnly = $request->getBool( 'diffonly', $user->getOption( 'diffonly' ) );
- $purge = $request->getVal( 'action' ) == 'purge';
- $unhide = $request->getInt( 'unhide' ) == 1;
- $oldid = $this->getOldID();
-
- $rev = $this->getRevisionFetched();
-
- if ( !$rev ) {
- $this->getContext()->getOutput()->setPageTitle( wfMessage( 'errorpagetitle' ) );
- $this->getContext()->getOutput()->addWikiMsg( 'difference-missing-revision', $oldid, 1 );
- return;
- }
-
- $contentHandler = $rev->getContentHandler();
- $de = $contentHandler->createDifferenceEngine(
- $this->getContext(),
- $oldid,
- $diff,
- $rcid,
- $purge,
- $unhide
- );
-
- // DifferenceEngine directly fetched the revision:
- $this->mRevIdFetched = $de->mNewid;
- $de->showDiffPage( $diffOnly );
-
- // Run view updates for the newer revision being diffed (and shown
- // below the diff if not $diffOnly).
- list( $old, $new ) = $de->mapDiffPrevNext( $oldid, $diff );
- // New can be false, convert it to 0 - this conveniently means the latest revision
- $this->mPage->doViewUpdates( $user, (int)$new );
- }
-
- /**
- * Show a page view for a page formatted as CSS or JavaScript. To be called by
- * Article::view() only.
- *
- * This exists mostly to serve the deprecated ShowRawCssJs hook (used to customize these views).
- * It has been replaced by the ContentGetParserOutput hook, which lets you do the same but with
- * more flexibility.
- *
- * @param bool $showCacheHint Whether to show a message telling the user
- * to clear the browser cache (default: true).
- */
- protected function showCssOrJsPage( $showCacheHint = true ) {
- $outputPage = $this->getContext()->getOutput();
-
- if ( $showCacheHint ) {
- $dir = $this->getContext()->getLanguage()->getDir();
- $lang = $this->getContext()->getLanguage()->getCode();
-
- $outputPage->wrapWikiMsg(
- "<div id='mw-clearyourcache' lang='$lang' dir='$dir' class='mw-content-$dir'>\n$1\n</div>",
- 'clearyourcache'
- );
- }
-
- $this->fetchContentObject();
-
- if ( $this->mContentObject ) {
- // Give hooks a chance to customise the output
- if ( ContentHandler::runLegacyHooks(
- 'ShowRawCssJs',
- array( $this->mContentObject, $this->getTitle(), $outputPage ) )
- ) {
- $po = $this->mContentObject->getParserOutput( $this->getTitle() );
- $outputPage->addHTML( $po->getText() );
- }
- }
- }
-
- /**
- * Get the robot policy to be used for the current view
- * @param string $action The action= GET parameter
- * @param ParserOutput|null $pOutput
- * @return array The policy that should be set
- * @todo: actions other than 'view'
- */
- public function getRobotPolicy( $action, $pOutput = null ) {
- global $wgArticleRobotPolicies, $wgNamespaceRobotPolicies, $wgDefaultRobotPolicy;
-
- $ns = $this->getTitle()->getNamespace();
-
- # Don't index user and user talk pages for blocked users (bug 11443)
- if ( ( $ns == NS_USER || $ns == NS_USER_TALK ) && !$this->getTitle()->isSubpage() ) {
- $specificTarget = null;
- $vagueTarget = null;
- $titleText = $this->getTitle()->getText();
- if ( IP::isValid( $titleText ) ) {
- $vagueTarget = $titleText;
- } else {
- $specificTarget = $titleText;
- }
- if ( Block::newFromTarget( $specificTarget, $vagueTarget ) instanceof Block ) {
- return array(
- 'index' => 'noindex',
- 'follow' => 'nofollow'
- );
- }
- }
-
- if ( $this->mPage->getID() === 0 || $this->getOldID() ) {
- # Non-articles (special pages etc), and old revisions
- return array(
- 'index' => 'noindex',
- 'follow' => 'nofollow'
- );
- } elseif ( $this->getContext()->getOutput()->isPrintable() ) {
- # Discourage indexing of printable versions, but encourage following
- return array(
- 'index' => 'noindex',
- 'follow' => 'follow'
- );
- } elseif ( $this->getContext()->getRequest()->getInt( 'curid' ) ) {
- # For ?curid=x urls, disallow indexing
- return array(
- 'index' => 'noindex',
- 'follow' => 'follow'
- );
- }
-
- # Otherwise, construct the policy based on the various config variables.
- $policy = self::formatRobotPolicy( $wgDefaultRobotPolicy );
-
- if ( isset( $wgNamespaceRobotPolicies[$ns] ) ) {
- # Honour customised robot policies for this namespace
- $policy = array_merge(
- $policy,
- self::formatRobotPolicy( $wgNamespaceRobotPolicies[$ns] )
- );
- }
- if ( $this->getTitle()->canUseNoindex() && is_object( $pOutput ) && $pOutput->getIndexPolicy() ) {
- # __INDEX__ and __NOINDEX__ magic words, if allowed. Incorporates
- # a final sanity check that we have really got the parser output.
- $policy = array_merge(
- $policy,
- array( 'index' => $pOutput->getIndexPolicy() )
- );
- }
-
- if ( isset( $wgArticleRobotPolicies[$this->getTitle()->getPrefixedText()] ) ) {
- # (bug 14900) site config can override user-defined __INDEX__ or __NOINDEX__
- $policy = array_merge(
- $policy,
- self::formatRobotPolicy( $wgArticleRobotPolicies[$this->getTitle()->getPrefixedText()] )
- );
- }
-
- return $policy;
- }
-
- /**
- * Converts a String robot policy into an associative array, to allow
- * merging of several policies using array_merge().
- * @param array|string $policy Returns empty array on null/false/'', transparent
- * to already-converted arrays, converts string.
- * @return array 'index' => \<indexpolicy\>, 'follow' => \<followpolicy\>
- */
- public static function formatRobotPolicy( $policy ) {
- if ( is_array( $policy ) ) {
- return $policy;
- } elseif ( !$policy ) {
- return array();
- }
-
- $policy = explode( ',', $policy );
- $policy = array_map( 'trim', $policy );
-
- $arr = array();
- foreach ( $policy as $var ) {
- if ( in_array( $var, array( 'index', 'noindex' ) ) ) {
- $arr['index'] = $var;
- } elseif ( in_array( $var, array( 'follow', 'nofollow' ) ) ) {
- $arr['follow'] = $var;
- }
- }
-
- return $arr;
- }
-
- /**
- * If this request is a redirect view, send "redirected from" subtitle to
- * the output. Returns true if the header was needed, false if this is not
- * a redirect view. Handles both local and remote redirects.
- *
- * @return bool
- */
- public function showRedirectedFromHeader() {
- global $wgRedirectSources;
- $outputPage = $this->getContext()->getOutput();
-
- $rdfrom = $this->getContext()->getRequest()->getVal( 'rdfrom' );
-
- if ( isset( $this->mRedirectedFrom ) ) {
- // This is an internally redirected page view.
- // We'll need a backlink to the source page for navigation.
- if ( wfRunHooks( 'ArticleViewRedirect', array( &$this ) ) ) {
- $redir = Linker::linkKnown(
- $this->mRedirectedFrom,
- null,
- array(),
- array( 'redirect' => 'no' )
- );
-
- $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
-
- // Set the fragment if one was specified in the redirect
- if ( $this->getTitle()->hasFragment() ) {
- $outputPage->addJsConfigVars( 'wgRedirectToFragment', $this->getTitle()->getFragmentForURL() );
- $outputPage->addModules( 'mediawiki.action.view.redirectToFragment' );
- }
-
- // Add a <link rel="canonical"> tag
- $outputPage->setCanonicalUrl( $this->getTitle()->getLocalURL() );
-
- // Tell the output object that the user arrived at this article through a redirect
- $outputPage->setRedirectedFrom( $this->mRedirectedFrom );
-
- return true;
- }
- } elseif ( $rdfrom ) {
- // This is an externally redirected view, from some other wiki.
- // If it was reported from a trusted site, supply a backlink.
- if ( $wgRedirectSources && preg_match( $wgRedirectSources, $rdfrom ) ) {
- $redir = Linker::makeExternalLink( $rdfrom, $rdfrom );
- $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
-
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Show a header specific to the namespace currently being viewed, like
- * [[MediaWiki:Talkpagetext]]. For Article::view().
- */
- public function showNamespaceHeader() {
- if ( $this->getTitle()->isTalkPage() ) {
- if ( !wfMessage( 'talkpageheader' )->isDisabled() ) {
- $this->getContext()->getOutput()->wrapWikiMsg(
- "<div class=\"mw-talkpageheader\">\n$1\n</div>",
- array( 'talkpageheader' )
- );
- }
- }
- }
-
- /**
- * Show the footer section of an ordinary page view
- */
- public function showViewFooter() {
- # check if we're displaying a [[User talk:x.x.x.x]] anonymous talk page
- if ( $this->getTitle()->getNamespace() == NS_USER_TALK
- && IP::isValid( $this->getTitle()->getText() )
- ) {
- $this->getContext()->getOutput()->addWikiMsg( 'anontalkpagetext' );
- }
-
- // Show a footer allowing the user to patrol the shown revision or page if possible
- $patrolFooterShown = $this->showPatrolFooter();
-
- wfRunHooks( 'ArticleViewFooter', array( $this, $patrolFooterShown ) );
- }
-
- /**
- * If patrol is possible, output a patrol UI box. This is called from the
- * footer section of ordinary page views. If patrol is not possible or not
- * desired, does nothing.
- * Side effect: When the patrol link is build, this method will call
- * OutputPage::preventClickjacking() and load mediawiki.page.patrol.ajax.
- *
- * @return bool
- */
- public function showPatrolFooter() {
- global $wgUseNPPatrol, $wgUseRCPatrol, $wgEnableAPI, $wgEnableWriteAPI;
-
- $outputPage = $this->getContext()->getOutput();
- $user = $this->getContext()->getUser();
- $cache = wfGetMainCache();
- $rc = false;
-
- if ( !$this->getTitle()->quickUserCan( 'patrol', $user )
- || !( $wgUseRCPatrol || $wgUseNPPatrol )
- ) {
- // Patrolling is disabled or the user isn't allowed to
- return false;
- }
-
- wfProfileIn( __METHOD__ );
-
- // New page patrol: Get the timestamp of the oldest revison which
- // the revision table holds for the given page. Then we look
- // whether it's within the RC lifespan and if it is, we try
- // to get the recentchanges row belonging to that entry
- // (with rc_new = 1).
-
- // Check for cached results
- if ( $cache->get( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ) ) ) {
- wfProfileOut( __METHOD__ );
- return false;
- }
-
- if ( $this->mRevision
- && !RecentChange::isInRCLifespan( $this->mRevision->getTimestamp(), 21600 )
- ) {
- // The current revision is already older than what could be in the RC table
- // 6h tolerance because the RC might not be cleaned out regularly
- wfProfileOut( __METHOD__ );
- return false;
- }
-
- $dbr = wfGetDB( DB_SLAVE );
- $oldestRevisionTimestamp = $dbr->selectField(
- 'revision',
- 'MIN( rev_timestamp )',
- array( 'rev_page' => $this->getTitle()->getArticleID() ),
- __METHOD__
- );
-
- if ( $oldestRevisionTimestamp
- && RecentChange::isInRCLifespan( $oldestRevisionTimestamp, 21600 )
- ) {
- // 6h tolerance because the RC might not be cleaned out regularly
- $rc = RecentChange::newFromConds(
- array(
- 'rc_new' => 1,
- 'rc_timestamp' => $oldestRevisionTimestamp,
- 'rc_namespace' => $this->getTitle()->getNamespace(),
- 'rc_cur_id' => $this->getTitle()->getArticleID(),
- 'rc_patrolled' => 0
- ),
- __METHOD__,
- array( 'USE INDEX' => 'new_name_timestamp' )
- );
- }
-
- if ( !$rc ) {
- // No RC entry around
-
- // Cache the information we gathered above in case we can't patrol
- // Don't cache in case we can patrol as this could change
- $cache->set( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ), '1' );
-
- wfProfileOut( __METHOD__ );
- return false;
- }
-
- if ( $rc->getPerformer()->getName() == $user->getName() ) {
- // Don't show a patrol link for own creations. If the user could
- // patrol them, they already would be patrolled
- wfProfileOut( __METHOD__ );
- return false;
- }
-
- $rcid = $rc->getAttribute( 'rc_id' );
-
- $token = $user->getEditToken( $rcid );
-
- $outputPage->preventClickjacking();
- if ( $wgEnableAPI && $wgEnableWriteAPI && $user->isAllowed( 'writeapi' ) ) {
- $outputPage->addModules( 'mediawiki.page.patrol.ajax' );
- }
-
- $link = Linker::linkKnown(
- $this->getTitle(),
- wfMessage( 'markaspatrolledtext' )->escaped(),
- array(),
- array(
- 'action' => 'markpatrolled',
- 'rcid' => $rcid,
- 'token' => $token,
- )
- );
-
- $outputPage->addHTML(
- "<div class='patrollink'>" .
- wfMessage( 'markaspatrolledlink' )->rawParams( $link )->escaped() .
- '</div>'
- );
-
- wfProfileOut( __METHOD__ );
- return true;
- }
-
- /**
- * Show the error text for a missing article. For articles in the MediaWiki
- * namespace, show the default message text. To be called from Article::view().
- */
- public function showMissingArticle() {
- global $wgSend404Code;
- $outputPage = $this->getContext()->getOutput();
- // Whether the page is a root user page of an existing user (but not a subpage)
- $validUserPage = false;
-
- # Show info in user (talk) namespace. Does the user exist? Is he blocked?
- if ( $this->getTitle()->getNamespace() == NS_USER
- || $this->getTitle()->getNamespace() == NS_USER_TALK
- ) {
- $parts = explode( '/', $this->getTitle()->getText() );
- $rootPart = $parts[0];
- $user = User::newFromName( $rootPart, false /* allow IP users*/ );
- $ip = User::isIP( $rootPart );
-
- if ( !( $user && $user->isLoggedIn() ) && !$ip ) { # User does not exist
- $outputPage->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n\$1\n</div>",
- array( 'userpage-userdoesnotexist-view', wfEscapeWikiText( $rootPart ) ) );
- } elseif ( $user->isBlocked() ) { # Show log extract if the user is currently blocked
- LogEventsList::showLogExtract(
- $outputPage,
- 'block',
- $user->getUserPage(),
- '',
- array(
- 'lim' => 1,
- 'showIfEmpty' => false,
- 'msgKey' => array(
- 'blocked-notice-logextract',
- $user->getName() # Support GENDER in notice
- )
- )
- );
- $validUserPage = !$this->getTitle()->isSubpage();
- } else {
- $validUserPage = !$this->getTitle()->isSubpage();
- }
- }
-
- wfRunHooks( 'ShowMissingArticle', array( $this ) );
-
- // Give extensions a chance to hide their (unrelated) log entries
- $logTypes = array( 'delete', 'move' );
- $conds = array( "log_action != 'revision'" );
- wfRunHooks( 'Article::MissingArticleConditions', array( &$conds, $logTypes ) );
-
- # Show delete and move logs
- LogEventsList::showLogExtract( $outputPage, $logTypes, $this->getTitle(), '',
- array( 'lim' => 10,
- 'conds' => $conds,
- 'showIfEmpty' => false,
- 'msgKey' => array( 'moveddeleted-notice' ) )
- );
-
- if ( !$this->mPage->hasViewableContent() && $wgSend404Code && !$validUserPage ) {
- // If there's no backing content, send a 404 Not Found
- // for better machine handling of broken links.
- $this->getContext()->getRequest()->response()->header( "HTTP/1.1 404 Not Found" );
- }
-
- if ( $validUserPage ) {
- // Also apply the robot policy for nonexisting user pages (as those aren't served as 404)
- $policy = $this->getRobotPolicy( 'view' );
- $outputPage->setIndexPolicy( $policy['index'] );
- $outputPage->setFollowPolicy( $policy['follow'] );
- }
-
- $hookResult = wfRunHooks( 'BeforeDisplayNoArticleText', array( $this ) );
-
- if ( ! $hookResult ) {
- return;
- }
-
- # Show error message
- $oldid = $this->getOldID();
- if ( $oldid ) {
- $text = wfMessage( 'missing-revision', $oldid )->plain();
- } elseif ( $this->getTitle()->getNamespace() === NS_MEDIAWIKI ) {
- // Use the default message text
- $text = $this->getTitle()->getDefaultMessageText();
- } elseif ( $this->getTitle()->quickUserCan( 'create', $this->getContext()->getUser() )
- && $this->getTitle()->quickUserCan( 'edit', $this->getContext()->getUser() )
- ) {
- $message = $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon';
- $text = wfMessage( $message )->plain();
- } else {
- $text = wfMessage( 'noarticletext-nopermission' )->plain();
- }
- $text = "<div class='noarticletext'>\n$text\n</div>";
-
- $outputPage->addWikiText( $text );
- }
-
- /**
- * If the revision requested for view is deleted, check permissions.
- * Send either an error message or a warning header to the output.
- *
- * @return bool true if the view is allowed, false if not.
- */
- public function showDeletedRevisionHeader() {
- if ( !$this->mRevision->isDeleted( Revision::DELETED_TEXT ) ) {
- // Not deleted
- return true;
- }
-
- $outputPage = $this->getContext()->getOutput();
- $user = $this->getContext()->getUser();
- // If the user is not allowed to see it...
- if ( !$this->mRevision->userCan( Revision::DELETED_TEXT, $user ) ) {
- $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
- 'rev-deleted-text-permission' );
-
- return false;
- // If the user needs to confirm that they want to see it...
- } elseif ( $this->getContext()->getRequest()->getInt( 'unhide' ) != 1 ) {
- # Give explanation and add a link to view the revision...
- $oldid = intval( $this->getOldID() );
- $link = $this->getTitle()->getFullURL( "oldid={$oldid}&unhide=1" );
- $msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
- 'rev-suppressed-text-unhide' : 'rev-deleted-text-unhide';
- $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
- array( $msg, $link ) );
-
- return false;
- // We are allowed to see...
- } else {
- $msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
- 'rev-suppressed-text-view' : 'rev-deleted-text-view';
- $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", $msg );
-
- return true;
- }
- }
-
- /**
- * Generate the navigation links when browsing through an article revisions
- * It shows the information as:
- * Revision as of \<date\>; view current revision
- * \<- Previous version | Next Version -\>
- *
- * @param int $oldid Revision ID of this article revision
- */
- public function setOldSubtitle( $oldid = 0 ) {
- if ( !wfRunHooks( 'DisplayOldSubtitle', array( &$this, &$oldid ) ) ) {
- return;
- }
-
- $unhide = $this->getContext()->getRequest()->getInt( 'unhide' ) == 1;
-
- # Cascade unhide param in links for easy deletion browsing
- $extraParams = array();
- if ( $unhide ) {
- $extraParams['unhide'] = 1;
- }
-
- if ( $this->mRevision && $this->mRevision->getId() === $oldid ) {
- $revision = $this->mRevision;
- } else {
- $revision = Revision::newFromId( $oldid );
- }
-
- $timestamp = $revision->getTimestamp();
-
- $current = ( $oldid == $this->mPage->getLatest() );
- $language = $this->getContext()->getLanguage();
- $user = $this->getContext()->getUser();
-
- $td = $language->userTimeAndDate( $timestamp, $user );
- $tddate = $language->userDate( $timestamp, $user );
- $tdtime = $language->userTime( $timestamp, $user );
-
- # Show user links if allowed to see them. If hidden, then show them only if requested...
- $userlinks = Linker::revUserTools( $revision, !$unhide );
-
- $infomsg = $current && !wfMessage( 'revision-info-current' )->isDisabled()
- ? 'revision-info-current'
- : 'revision-info';
-
- $outputPage = $this->getContext()->getOutput();
- $outputPage->addSubtitle( "<div id=\"mw-{$infomsg}\">" . wfMessage( $infomsg,
- $td )->rawParams( $userlinks )->params( $revision->getID(), $tddate,
- $tdtime, $revision->getUser() )->rawParams( Linker::revComment( $revision, true, true ) )->parse() . "</div>" );
-
- $lnk = $current
- ? wfMessage( 'currentrevisionlink' )->escaped()
- : Linker::linkKnown(
- $this->getTitle(),
- wfMessage( 'currentrevisionlink' )->escaped(),
- array(),
- $extraParams
- );
- $curdiff = $current
- ? wfMessage( 'diff' )->escaped()
- : Linker::linkKnown(
- $this->getTitle(),
- wfMessage( 'diff' )->escaped(),
- array(),
- array(
- 'diff' => 'cur',
- 'oldid' => $oldid
- ) + $extraParams
- );
- $prev = $this->getTitle()->getPreviousRevisionID( $oldid );
- $prevlink = $prev
- ? Linker::linkKnown(
- $this->getTitle(),
- wfMessage( 'previousrevision' )->escaped(),
- array(),
- array(
- 'direction' => 'prev',
- 'oldid' => $oldid
- ) + $extraParams
- )
- : wfMessage( 'previousrevision' )->escaped();
- $prevdiff = $prev
- ? Linker::linkKnown(
- $this->getTitle(),
- wfMessage( 'diff' )->escaped(),
- array(),
- array(
- 'diff' => 'prev',
- 'oldid' => $oldid
- ) + $extraParams
- )
- : wfMessage( 'diff' )->escaped();
- $nextlink = $current
- ? wfMessage( 'nextrevision' )->escaped()
- : Linker::linkKnown(
- $this->getTitle(),
- wfMessage( 'nextrevision' )->escaped(),
- array(),
- array(
- 'direction' => 'next',
- 'oldid' => $oldid
- ) + $extraParams
- );
- $nextdiff = $current
- ? wfMessage( 'diff' )->escaped()
- : Linker::linkKnown(
- $this->getTitle(),
- wfMessage( 'diff' )->escaped(),
- array(),
- array(
- 'diff' => 'next',
- 'oldid' => $oldid
- ) + $extraParams
- );
-
- $cdel = Linker::getRevDeleteLink( $user, $revision, $this->getTitle() );
- if ( $cdel !== '' ) {
- $cdel .= ' ';
- }
-
- $outputPage->addSubtitle( "<div id=\"mw-revision-nav\">" . $cdel .
- wfMessage( 'revision-nav' )->rawParams(
- $prevdiff, $prevlink, $lnk, $curdiff, $nextlink, $nextdiff
- )->escaped() . "</div>" );
- }
-
- /**
- * Return the HTML for the top of a redirect page
- *
- * Chances are you should just be using the ParserOutput from
- * WikitextContent::getParserOutput instead of calling this for redirects.
- *
- * @param Title|array $target Destination(s) to redirect
- * @param bool $appendSubtitle [optional]
- * @param bool $forceKnown Should the image be shown as a bluelink regardless of existence?
- * @return string Containing HMTL with redirect link
- */
- public function viewRedirect( $target, $appendSubtitle = true, $forceKnown = false ) {
- $lang = $this->getTitle()->getPageLanguage();
- if ( $appendSubtitle ) {
- $out = $this->getContext()->getOutput();
- $out->addSubtitle( wfMessage( 'redirectpagesub' )->parse() );
- }
- return static::getRedirectHeaderHtml( $lang, $target, $forceKnown );
- }
-
- /**
- * Return the HTML for the top of a redirect page
- *
- * Chances are you should just be using the ParserOutput from
- * WikitextContent::getParserOutput instead of calling this for redirects.
- *
- * @since 1.23
- * @param Language $lang
- * @param Title|array $target Destination(s) to redirect
- * @param bool $forceKnown Should the image be shown as a bluelink regardless of existence?
- * @return string Containing HMTL with redirect link
- */
- public static function getRedirectHeaderHtml( Language $lang, $target, $forceKnown = false ) {
- global $wgStylePath;
-
- if ( !is_array( $target ) ) {
- $target = array( $target );
- }
-
- $imageDir = $lang->getDir();
-
- // the loop prepends the arrow image before the link, so the first case needs to be outside
-
- /** @var $title Title */
- $title = array_shift( $target );
-
- if ( $forceKnown ) {
- $link = Linker::linkKnown( $title, htmlspecialchars( $title->getFullText() ) );
- } else {
- $link = Linker::link( $title, htmlspecialchars( $title->getFullText() ) );
- }
-
- $nextRedirect = $wgStylePath . '/common/images/nextredirect' . $imageDir . '.png';
- $alt = $lang->isRTL() ? '←' : '→';
-
- // Automatically append redirect=no to each link, since most of them are
- // redirect pages themselves.
- /** @var Title $rt */
- foreach ( $target as $rt ) {
- $link .= Html::element( 'img', array( 'src' => $nextRedirect, 'alt' => $alt ) );
- if ( $forceKnown ) {
- $link .= Linker::linkKnown(
- $rt,
- htmlspecialchars( $rt->getFullText(),
- array(),
- array( 'redirect' => 'no' )
- )
- );
- } else {
- $link .= Linker::link(
- $rt,
- htmlspecialchars( $rt->getFullText() ),
- array(),
- array( 'redirect' => 'no' )
- );
- }
- }
-
- $imageUrl = $wgStylePath . '/common/images/redirect' . $imageDir . '.png';
- return '<div class="redirectMsg">' .
- Html::element( 'img', array( 'src' => $imageUrl, 'alt' => '#REDIRECT' ) ) .
- '<span class="redirectText">' . $link . '</span></div>';
- }
-
- /**
- * Handle action=render
- */
- public function render() {
- $this->getContext()->getRequest()->response()->header( 'X-Robots-Tag: noindex' );
- $this->getContext()->getOutput()->setArticleBodyOnly( true );
- $this->getContext()->getOutput()->enableSectionEditLinks( false );
- $this->view();
- }
-
- /**
- * action=protect handler
- */
- public function protect() {
- $form = new ProtectionForm( $this );
- $form->execute();
- }
-
- /**
- * action=unprotect handler (alias)
- */
- public function unprotect() {
- $this->protect();
- }
-
- /**
- * UI entry point for page deletion
- */
- public function delete() {
- # This code desperately needs to be totally rewritten
-
- $title = $this->getTitle();
- $user = $this->getContext()->getUser();
-
- # Check permissions
- $permission_errors = $title->getUserPermissionsErrors( 'delete', $user );
- if ( count( $permission_errors ) ) {
- throw new PermissionsError( 'delete', $permission_errors );
- }
-
- # Read-only check...
- if ( wfReadOnly() ) {
- throw new ReadOnlyError;
- }
-
- # Better double-check that it hasn't been deleted yet!
- $this->mPage->loadPageData( 'fromdbmaster' );
- if ( !$this->mPage->exists() ) {
- $deleteLogPage = new LogPage( 'delete' );
- $outputPage = $this->getContext()->getOutput();
- $outputPage->setPageTitle( wfMessage( 'cannotdelete-title', $title->getPrefixedText() ) );
- $outputPage->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
- array( 'cannotdelete', wfEscapeWikiText( $title->getPrefixedText() ) )
- );
- $outputPage->addHTML(
- Xml::element( 'h2', null, $deleteLogPage->getName()->text() )
- );
- LogEventsList::showLogExtract(
- $outputPage,
- 'delete',
- $title
- );
-
- return;
- }
-
- $request = $this->getContext()->getRequest();
- $deleteReasonList = $request->getText( 'wpDeleteReasonList', 'other' );
- $deleteReason = $request->getText( 'wpReason' );
-
- if ( $deleteReasonList == 'other' ) {
- $reason = $deleteReason;
- } elseif ( $deleteReason != '' ) {
- // Entry from drop down menu + additional comment
- $colonseparator = wfMessage( 'colon-separator' )->inContentLanguage()->text();
- $reason = $deleteReasonList . $colonseparator . $deleteReason;
- } else {
- $reason = $deleteReasonList;
- }
-
- if ( $request->wasPosted() && $user->matchEditToken( $request->getVal( 'wpEditToken' ),
- array( 'delete', $this->getTitle()->getPrefixedText() ) )
- ) {
- # Flag to hide all contents of the archived revisions
- $suppress = $request->getVal( 'wpSuppress' ) && $user->isAllowed( 'suppressrevision' );
-
- $this->doDelete( $reason, $suppress );
-
- WatchAction::doWatchOrUnwatch( $request->getCheck( 'wpWatch' ), $title, $user );
-
- return;
- }
-
- // Generate deletion reason
- $hasHistory = false;
- if ( !$reason ) {
- try {
- $reason = $this->generateReason( $hasHistory );
- } catch ( MWException $e ) {
- # if a page is horribly broken, we still want to be able to
- # delete it. So be lenient about errors here.
- wfDebug( "Error while building auto delete summary: $e" );
- $reason = '';
- }
- }
-
- // If the page has a history, insert a warning
- if ( $hasHistory ) {
- $revisions = $this->mTitle->estimateRevisionCount();
- // @todo FIXME: i18n issue/patchwork message
- $this->getContext()->getOutput()->addHTML( '<strong class="mw-delete-warning-revisions">' .
- wfMessage( 'historywarning' )->numParams( $revisions )->parse() .
- wfMessage( 'word-separator' )->plain() . Linker::linkKnown( $title,
- wfMessage( 'history' )->escaped(),
- array( 'rel' => 'archives' ),
- array( 'action' => 'history' ) ) .
- '</strong>'
- );
-
- if ( $this->mTitle->isBigDeletion() ) {
- global $wgDeleteRevisionsLimit;
- $this->getContext()->getOutput()->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
- array(
- 'delete-warning-toobig',
- $this->getContext()->getLanguage()->formatNum( $wgDeleteRevisionsLimit )
- )
- );
- }
- }
-
- $this->confirmDelete( $reason );
- }
-
- /**
- * Output deletion confirmation dialog
- * @todo FIXME: Move to another file?
- * @param string $reason Prefilled reason
- */
- public function confirmDelete( $reason ) {
- wfDebug( "Article::confirmDelete\n" );
-
- $outputPage = $this->getContext()->getOutput();
- $outputPage->setPageTitle( wfMessage( 'delete-confirm', $this->getTitle()->getPrefixedText() ) );
- $outputPage->addBacklinkSubtitle( $this->getTitle() );
- $outputPage->setRobotPolicy( 'noindex,nofollow' );
- $backlinkCache = $this->getTitle()->getBacklinkCache();
- if ( $backlinkCache->hasLinks( 'pagelinks' ) || $backlinkCache->hasLinks( 'templatelinks' ) ) {
- $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
- 'deleting-backlinks-warning' );
- }
- $outputPage->addWikiMsg( 'confirmdeletetext' );
-
- wfRunHooks( 'ArticleConfirmDelete', array( $this, $outputPage, &$reason ) );
-
- $user = $this->getContext()->getUser();
-
- if ( $user->isAllowed( 'suppressrevision' ) ) {
- $suppress = "<tr id=\"wpDeleteSuppressRow\">
- <td></td>
- <td class='mw-input'><strong>" .
- Xml::checkLabel( wfMessage( 'revdelete-suppress' )->text(),
- 'wpSuppress', 'wpSuppress', false, array( 'tabindex' => '4' ) ) .
- "</strong></td>
- </tr>";
- } else {
- $suppress = '';
- }
- $checkWatch = $user->getBoolOption( 'watchdeletion' ) || $user->isWatched( $this->getTitle() );
-
- $form = Xml::openElement( 'form', array( 'method' => 'post',
- 'action' => $this->getTitle()->getLocalURL( 'action=delete' ), 'id' => 'deleteconfirm' ) ) .
- Xml::openElement( 'fieldset', array( 'id' => 'mw-delete-table' ) ) .
- Xml::tags( 'legend', null, wfMessage( 'delete-legend' )->escaped() ) .
- Xml::openElement( 'table', array( 'id' => 'mw-deleteconfirm-table' ) ) .
- "<tr id=\"wpDeleteReasonListRow\">
- <td class='mw-label'>" .
- Xml::label( wfMessage( 'deletecomment' )->text(), 'wpDeleteReasonList' ) .
- "</td>
- <td class='mw-input'>" .
- Xml::listDropDown(
- 'wpDeleteReasonList',
- wfMessage( 'deletereason-dropdown' )->inContentLanguage()->text(),
- wfMessage( 'deletereasonotherlist' )->inContentLanguage()->text(),
- '',
- 'wpReasonDropDown',
- 1
- ) .
- "</td>
- </tr>
- <tr id=\"wpDeleteReasonRow\">
- <td class='mw-label'>" .
- Xml::label( wfMessage( 'deleteotherreason' )->text(), 'wpReason' ) .
- "</td>
- <td class='mw-input'>" .
- Html::input( 'wpReason', $reason, 'text', array(
- 'size' => '60',
- 'maxlength' => '255',
- 'tabindex' => '2',
- 'id' => 'wpReason',
- 'autofocus'
- ) ) .
- "</td>
- </tr>";
-
- # Disallow watching if user is not logged in
- if ( $user->isLoggedIn() ) {
- $form .= "
- <tr>
- <td></td>
- <td class='mw-input'>" .
- Xml::checkLabel( wfMessage( 'watchthis' )->text(),
- 'wpWatch', 'wpWatch', $checkWatch, array( 'tabindex' => '3' ) ) .
- "</td>
- </tr>";
- }
-
- $form .= "
- $suppress
- <tr>
- <td></td>
- <td class='mw-submit'>" .
- Xml::submitButton( wfMessage( 'deletepage' )->text(),
- array( 'name' => 'wpConfirmB', 'id' => 'wpConfirmB', 'tabindex' => '5' ) ) .
- "</td>
- </tr>" .
- Xml::closeElement( 'table' ) .
- Xml::closeElement( 'fieldset' ) .
- Html::hidden(
- 'wpEditToken',
- $user->getEditToken( array( 'delete', $this->getTitle()->getPrefixedText() ) )
- ) .
- Xml::closeElement( 'form' );
-
- if ( $user->isAllowed( 'editinterface' ) ) {
- $title = Title::makeTitle( NS_MEDIAWIKI, 'Deletereason-dropdown' );
- $link = Linker::link(
- $title,
- wfMessage( 'delete-edit-reasonlist' )->escaped(),
- array(),
- array( 'action' => 'edit' )
- );
- $form .= '<p class="mw-delete-editreasons">' . $link . '</p>';
- }
-
- $outputPage->addHTML( $form );
-
- $deleteLogPage = new LogPage( 'delete' );
- $outputPage->addHTML( Xml::element( 'h2', null, $deleteLogPage->getName()->text() ) );
- LogEventsList::showLogExtract( $outputPage, 'delete',
- $this->getTitle()
- );
- }
-
- /**
- * Perform a deletion and output success or failure messages
- * @param string $reason
- * @param bool $suppress
- */
- public function doDelete( $reason, $suppress = false ) {
- $error = '';
- $outputPage = $this->getContext()->getOutput();
- $status = $this->mPage->doDeleteArticleReal( $reason, $suppress, 0, true, $error );
-
- if ( $status->isGood() ) {
- $deleted = $this->getTitle()->getPrefixedText();
-
- $outputPage->setPageTitle( wfMessage( 'actioncomplete' ) );
- $outputPage->setRobotPolicy( 'noindex,nofollow' );
-
- $loglink = '[[Special:Log/delete|' . wfMessage( 'deletionlog' )->text() . ']]';
-
- $outputPage->addWikiMsg( 'deletedtext', wfEscapeWikiText( $deleted ), $loglink );
- $outputPage->returnToMain( false );
- } else {
- $outputPage->setPageTitle(
- wfMessage( 'cannotdelete-title',
- $this->getTitle()->getPrefixedText() )
- );
-
- if ( $error == '' ) {
- $outputPage->addWikiText(
- "<div class=\"error mw-error-cannotdelete\">\n" . $status->getWikiText() . "\n</div>"
- );
- $deleteLogPage = new LogPage( 'delete' );
- $outputPage->addHTML( Xml::element( 'h2', null, $deleteLogPage->getName()->text() ) );
-
- LogEventsList::showLogExtract(
- $outputPage,
- 'delete',
- $this->getTitle()
- );
- } else {
- $outputPage->addHTML( $error );
- }
- }
- }
-
- /* Caching functions */
-
- /**
- * checkLastModified returns true if it has taken care of all
- * output to the client that is necessary for this request.
- * (that is, it has sent a cached version of the page)
- *
- * @return bool true if cached version send, false otherwise
- */
- protected function tryFileCache() {
- static $called = false;
-
- if ( $called ) {
- wfDebug( "Article::tryFileCache(): called twice!?\n" );
- return false;
- }
-
- $called = true;
- if ( $this->isFileCacheable() ) {
- $cache = HTMLFileCache::newFromTitle( $this->getTitle(), 'view' );
- if ( $cache->isCacheGood( $this->mPage->getTouched() ) ) {
- wfDebug( "Article::tryFileCache(): about to load file\n" );
- $cache->loadFromFileCache( $this->getContext() );
- return true;
- } else {
- wfDebug( "Article::tryFileCache(): starting buffer\n" );
- ob_start( array( &$cache, 'saveToFileCache' ) );
- }
- } else {
- wfDebug( "Article::tryFileCache(): not cacheable\n" );
- }
-
- return false;
- }
-
- /**
- * Check if the page can be cached
- * @return bool
- */
- public function isFileCacheable() {
- $cacheable = false;
-
- if ( HTMLFileCache::useFileCache( $this->getContext() ) ) {
- $cacheable = $this->mPage->getID()
- && !$this->mRedirectedFrom && !$this->getTitle()->isRedirect();
- // Extension may have reason to disable file caching on some pages.
- if ( $cacheable ) {
- $cacheable = wfRunHooks( 'IsFileCacheable', array( &$this ) );
- }
- }
-
- return $cacheable;
- }
-
- /**#@-*/
-
- /**
- * Lightweight method to get the parser output for a page, checking the parser cache
- * and so on. Doesn't consider most of the stuff that WikiPage::view is forced to
- * consider, so it's not appropriate to use there.
- *
- * @since 1.16 (r52326) for LiquidThreads
- *
- * @param int|null $oldid Revision ID or null
- * @param User $user The relevant user
- * @return ParserOutput|bool ParserOutput or false if the given revision ID is not found
- */
- public function getParserOutput( $oldid = null, User $user = null ) {
- //XXX: bypasses mParserOptions and thus setParserOptions()
-
- if ( $user === null ) {
- $parserOptions = $this->getParserOptions();
- } else {
- $parserOptions = $this->mPage->makeParserOptions( $user );
- }
-
- return $this->mPage->getParserOutput( $parserOptions, $oldid );
- }
-
- /**
- * Override the ParserOptions used to render the primary article wikitext.
- *
- * @param ParserOptions $options
- * @throws MWException if the parser options where already initialized.
- */
- public function setParserOptions( ParserOptions $options ) {
- if ( $this->mParserOptions ) {
- throw new MWException( "can't change parser options after they have already been set" );
- }
-
- // clone, so if $options is modified later, it doesn't confuse the parser cache.
- $this->mParserOptions = clone $options;
- }
-
- /**
- * Get parser options suitable for rendering the primary article wikitext
- * @return ParserOptions
- */
- public function getParserOptions() {
- if ( !$this->mParserOptions ) {
- $this->mParserOptions = $this->mPage->makeParserOptions( $this->getContext() );
- }
- // Clone to allow modifications of the return value without affecting cache
- return clone $this->mParserOptions;
- }
-
- /**
- * Sets the context this Article is executed in
- *
- * @param IContextSource $context
- * @since 1.18
- */
- public function setContext( $context ) {
- $this->mContext = $context;
- }
-
- /**
- * Gets the context this Article is executed in
- *
- * @return IContextSource
- * @since 1.18
- */
- public function getContext() {
- if ( $this->mContext instanceof IContextSource ) {
- return $this->mContext;
- } else {
- wfDebug( __METHOD__ . " called and \$mContext is null. " .
- "Return RequestContext::getMain(); for sanity\n" );
- return RequestContext::getMain();
- }
- }
-
- /**
- * Info about this page
- * @deprecated since 1.19
- */
- public function info() {
- wfDeprecated( __METHOD__, '1.19' );
- Action::factory( 'info', $this )->show();
- }
-
- /**
- * Handle action=purge
- * @deprecated since 1.19
- * @return Action|bool|null false if the action is disabled, null if it is not recognised
- */
- public function purge() {
- return Action::factory( 'purge', $this )->show();
- }
-
- /**
- * Handle action=revert
- * @deprecated since 1.19
- */
- public function revert() {
- wfDeprecated( __METHOD__, '1.19' );
- Action::factory( 'revert', $this )->show();
- }
-
- /**
- * Handle action=rollback
- * @deprecated since 1.19
- */
- public function rollback() {
- wfDeprecated( __METHOD__, '1.19' );
- Action::factory( 'rollback', $this )->show();
- }
-
- /**
- * Use PHP's magic __get handler to handle accessing of
- * raw WikiPage fields for backwards compatibility.
- *
- * @param string $fname Field name
- */
- public function __get( $fname ) {
- if ( property_exists( $this->mPage, $fname ) ) {
- #wfWarn( "Access to raw $fname field " . __CLASS__ );
- return $this->mPage->$fname;
- }
- trigger_error( 'Inaccessible property via __get(): ' . $fname, E_USER_NOTICE );
- }
-
- /**
- * Use PHP's magic __set handler to handle setting of
- * raw WikiPage fields for backwards compatibility.
- *
- * @param string $fname Field name
- * @param mixed $fvalue New value
- */
- public function __set( $fname, $fvalue ) {
- if ( property_exists( $this->mPage, $fname ) ) {
- #wfWarn( "Access to raw $fname field of " . __CLASS__ );
- $this->mPage->$fname = $fvalue;
- // Note: extensions may want to toss on new fields
- } elseif ( !in_array( $fname, array( 'mContext', 'mPage' ) ) ) {
- $this->mPage->$fname = $fvalue;
- } else {
- trigger_error( 'Inaccessible property via __set(): ' . $fname, E_USER_NOTICE );
- }
- }
-
- /**
- * Use PHP's magic __call handler to transform instance calls to
- * WikiPage functions for backwards compatibility.
- *
- * @param string $fname Name of called method
- * @param array $args Arguments to the method
- * @return mixed
- */
- public function __call( $fname, $args ) {
- if ( is_callable( array( $this->mPage, $fname ) ) ) {
- #wfWarn( "Call to " . __CLASS__ . "::$fname; please use WikiPage instead" );
- return call_user_func_array( array( $this->mPage, $fname ), $args );
- }
- trigger_error( 'Inaccessible function via __call(): ' . $fname, E_USER_ERROR );
- }
-
- // ****** B/C functions to work-around PHP silliness with __call and references ****** //
-
- /**
- * @param array $limit
- * @param array $expiry
- * @param bool $cascade
- * @param string $reason
- * @param User $user
- * @return Status
- */
- public function doUpdateRestrictions( array $limit, array $expiry, &$cascade,
- $reason, User $user
- ) {
- return $this->mPage->doUpdateRestrictions( $limit, $expiry, $cascade, $reason, $user );
- }
-
- /**
- * @param array $limit
- * @param string $reason
- * @param int $cascade
- * @param array $expiry
- * @return bool
- */
- public function updateRestrictions( $limit = array(), $reason = '',
- &$cascade = 0, $expiry = array()
- ) {
- return $this->mPage->doUpdateRestrictions(
- $limit,
- $expiry,
- $cascade,
- $reason,
- $this->getContext()->getUser()
- );
- }
-
- /**
- * @param string $reason
- * @param bool $suppress
- * @param int $id
- * @param bool $commit
- * @param string $error
- * @return bool
- */
- public function doDeleteArticle( $reason, $suppress = false, $id = 0,
- $commit = true, &$error = ''
- ) {
- return $this->mPage->doDeleteArticle( $reason, $suppress, $id, $commit, $error );
- }
-
- /**
- * @param string $fromP
- * @param string $summary
- * @param string $token
- * @param bool $bot
- * @param array $resultDetails
- * @param User|null $user
- * @return array
- */
- public function doRollback( $fromP, $summary, $token, $bot, &$resultDetails, User $user = null ) {
- $user = is_null( $user ) ? $this->getContext()->getUser() : $user;
- return $this->mPage->doRollback( $fromP, $summary, $token, $bot, $resultDetails, $user );
- }
-
- /**
- * @param string $fromP
- * @param string $summary
- * @param bool $bot
- * @param array $resultDetails
- * @param User|null $guser
- * @return array
- */
- public function commitRollback( $fromP, $summary, $bot, &$resultDetails, User $guser = null ) {
- $guser = is_null( $guser ) ? $this->getContext()->getUser() : $guser;
- return $this->mPage->commitRollback( $fromP, $summary, $bot, $resultDetails, $guser );
- }
-
- /**
- * @param bool $hasHistory
- * @return mixed
- */
- public function generateReason( &$hasHistory ) {
- $title = $this->mPage->getTitle();
- $handler = ContentHandler::getForTitle( $title );
- return $handler->getAutoDeleteReason( $title, $hasHistory );
- }
-
- // ****** B/C functions for static methods ( __callStatic is PHP>=5.3 ) ****** //
-
- /**
- * @return array
- */
- public static function selectFields() {
- return WikiPage::selectFields();
- }
-
- /**
- * @param Title $title
- */
- public static function onArticleCreate( $title ) {
- WikiPage::onArticleCreate( $title );
- }
-
- /**
- * @param Title $title
- */
- public static function onArticleDelete( $title ) {
- WikiPage::onArticleDelete( $title );
- }
-
- /**
- * @param Title $title
- */
- public static function onArticleEdit( $title ) {
- WikiPage::onArticleEdit( $title );
- }
-
- /**
- * @param string $oldtext
- * @param string $newtext
- * @param int $flags
- * @return string
- * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
- */
- public static function getAutosummary( $oldtext, $newtext, $flags ) {
- return WikiPage::getAutosummary( $oldtext, $newtext, $flags );
- }
- // ******
-}
'AjaxDispatcher' => 'includes/AjaxDispatcher.php',
'AjaxResponse' => 'includes/AjaxResponse.php',
'AlphabeticPager' => 'includes/Pager.php',
- 'Article' => 'includes/Article.php',
'AtomFeed' => 'includes/Feed.php',
'AuthPlugin' => 'includes/AuthPlugin.php',
'AuthPluginUser' => 'includes/AuthPlugin.php',
'CacheHelper' => 'includes/CacheHelper.php',
'Category' => 'includes/Category.php',
'Categoryfinder' => 'includes/Categoryfinder.php',
- 'CategoryPage' => 'includes/CategoryPage.php',
'CategoryViewer' => 'includes/CategoryViewer.php',
'ChangesFeed' => 'includes/ChangesFeed.php',
'ChangeTags' => 'includes/ChangeTags.php',
'ICacheHelper' => 'includes/CacheHelper.php',
'IcuCollation' => 'includes/Collation.php',
'IdentityCollation' => 'includes/Collation.php',
- 'ImageHistoryList' => 'includes/ImagePage.php',
- 'ImageHistoryPseudoPager' => 'includes/ImagePage.php',
- 'ImagePage' => 'includes/ImagePage.php',
'ImageQueryPage' => 'includes/ImageQueryPage.php',
'ImportStreamSource' => 'includes/Import.php',
'ImportStringSource' => 'includes/Import.php',
'MWInit' => 'includes/Init.php',
'MWNamespace' => 'includes/Namespace.php',
'OutputPage' => 'includes/OutputPage.php',
- 'Page' => 'includes/WikiPage.php',
'PageQueryPage' => 'includes/PageQueryPage.php',
'Pager' => 'includes/Pager.php',
'PasswordError' => 'includes/User.php',
'PoolCounterRedis' => 'includes/poolcounter/PoolCounterRedis.php',
'PoolCounterWork' => 'includes/poolcounter/PoolCounterWork.php',
'PoolCounterWorkViaCallback' => 'includes/poolcounter/PoolCounterWork.php',
- 'PoolWorkArticleView' => 'includes/WikiPage.php',
+ 'PoolWorkArticleView' => 'includes/poolcounter/PoolWorkArticleView.php',
'Preferences' => 'includes/Preferences.php',
'PreferencesForm' => 'includes/Preferences.php',
'PrefixSearch' => 'includes/PrefixSearch.php',
'WebRequest' => 'includes/WebRequest.php',
'WebRequestUpload' => 'includes/WebRequest.php',
'WebResponse' => 'includes/WebResponse.php',
- 'WikiCategoryPage' => 'includes/WikiCategoryPage.php',
'WikiExporter' => 'includes/Export.php',
- 'WikiFilePage' => 'includes/WikiFilePage.php',
'WikiImporter' => 'includes/Import.php',
- 'WikiPage' => 'includes/WikiPage.php',
'WikiRevision' => 'includes/Import.php',
'WikiMap' => 'includes/WikiMap.php',
'WikiReference' => 'includes/WikiMap.php',
'WinCacheBagOStuff' => 'includes/objectcache/WinCacheBagOStuff.php',
'XCacheBagOStuff' => 'includes/objectcache/XCacheBagOStuff.php',
+ # includes/page
+ 'Article' => 'includes/page/Article.php',
+ 'CategoryPage' => 'includes/page/CategoryPage.php',
+ 'ImageHistoryList' => 'includes/page/ImagePage.php',
+ 'ImageHistoryPseudoPager' => 'includes/page/ImagePage.php',
+ 'ImagePage' => 'includes/page/ImagePage.php',
+ 'Page' => 'includes/page/WikiPage.php',
+ 'WikiCategoryPage' => 'includes/page/WikiCategoryPage.php',
+ 'WikiFilePage' => 'includes/page/WikiFilePage.php',
+ 'WikiPage' => 'includes/page/WikiPage.php',
+
# includes/parser
'CacheTime' => 'includes/parser/CacheTime.php',
'CoreParserFunctions' => 'includes/parser/CoreParserFunctions.php',
'ParserCache' => 'includes/parser/ParserCache.php',
'ParserOptions' => 'includes/parser/ParserOptions.php',
'ParserOutput' => 'includes/parser/ParserOutput.php',
- 'Parser_DiffTest' => 'includes/parser/Parser_DiffTest.php',
+ 'ParserDiffTest' => 'includes/parser/ParserDiffTest.php',
'Preprocessor' => 'includes/parser/Preprocessor.php',
'Preprocessor_DOM' => 'includes/parser/Preprocessor_DOM.php',
'Preprocessor_Hash' => 'includes/parser/Preprocessor_Hash.php',
'SearchPostgres' => 'includes/search/SearchPostgres.php',
'SearchResult' => 'includes/search/SearchResult.php',
'SearchResultSet' => 'includes/search/SearchResultSet.php',
- 'SearchResultTooMany' => 'includes/search/SearchEngine.php',
'SearchSqlite' => 'includes/search/SearchSqlite.php',
'SqlSearchResultSet' => 'includes/search/SearchResultSet.php',
# mw-config
'InstallerOverrides' => 'mw-config/overrides.php',
'MyLocalSettingsGenerator' => 'mw-config/overrides.php',
-
- # skins
- 'MonoBookTemplate' => 'skins/monobook/MonoBook.php',
- 'SkinMonoBook' => 'skins/monobook/MonoBook.php',
- 'SkinVector' => 'skins/vector/Vector.php',
- 'VectorTemplate' => 'skins/vector/Vector.php',
);
class AutoLoader {
+++ /dev/null
-<?php
-/**
- * Special handling for category description pages.
- * Modelled after ImagePage.php.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Special handling for category description pages, showing pages,
- * subcategories and file that belong to the category
- */
-class CategoryPage extends Article {
- # Subclasses can change this to override the viewer class.
- protected $mCategoryViewerClass = 'CategoryViewer';
-
- /**
- * @param Title $title
- * @return WikiCategoryPage
- */
- protected function newPage( Title $title ) {
- // Overload mPage with a category-specific page
- return new WikiCategoryPage( $title );
- }
-
- /**
- * Constructor from a page id
- * @param int $id Article ID to load
- * @return CategoryPage|null
- */
- public static function newFromID( $id ) {
- $t = Title::newFromID( $id );
- # @todo FIXME: Doesn't inherit right
- return $t == null ? null : new self( $t );
- # return $t == null ? null : new static( $t ); // PHP 5.3
- }
-
- function view() {
- $request = $this->getContext()->getRequest();
- $diff = $request->getVal( 'diff' );
- $diffOnly = $request->getBool( 'diffonly',
- $this->getContext()->getUser()->getOption( 'diffonly' ) );
-
- if ( $diff !== null && $diffOnly ) {
- parent::view();
- return;
- }
-
- if ( !wfRunHooks( 'CategoryPageView', array( &$this ) ) ) {
- return;
- }
-
- $title = $this->getTitle();
- if ( NS_CATEGORY == $title->getNamespace() ) {
- $this->openShowCategory();
- }
-
- parent::view();
-
- if ( NS_CATEGORY == $title->getNamespace() ) {
- $this->closeShowCategory();
- }
- }
-
- function openShowCategory() {
- # For overloading
- }
-
- function closeShowCategory() {
- // Use these as defaults for back compat --catrope
- $request = $this->getContext()->getRequest();
- $oldFrom = $request->getVal( 'from' );
- $oldUntil = $request->getVal( 'until' );
-
- $reqArray = $request->getValues();
-
- $from = $until = array();
- foreach ( array( 'page', 'subcat', 'file' ) as $type ) {
- $from[$type] = $request->getVal( "{$type}from", $oldFrom );
- $until[$type] = $request->getVal( "{$type}until", $oldUntil );
-
- // Do not want old-style from/until propagating in nav links.
- if ( !isset( $reqArray["{$type}from"] ) && isset( $reqArray["from"] ) ) {
- $reqArray["{$type}from"] = $reqArray["from"];
- }
- if ( !isset( $reqArray["{$type}to"] ) && isset( $reqArray["to"] ) ) {
- $reqArray["{$type}to"] = $reqArray["to"];
- }
- }
-
- unset( $reqArray["from"] );
- unset( $reqArray["to"] );
-
- $viewer = new $this->mCategoryViewerClass(
- $this->getContext()->getTitle(),
- $this->getContext(),
- $from,
- $until,
- $reqArray
- );
- $this->getContext()->getOutput()->addHTML( $viewer->getHTML() );
- }
-}
* Path of the djvutoxml executable
* This works like djvudump except much, much slower as of version 3.5.
*
- * For now we recommend you use djvudump instead. The djvuxml output is
+ * For now we recommend you use djvudump instead. The djvuxml output is
* probably more stable, so we'll switch back to it as soon as they fix
* the efficiency problem.
* http://sourceforge.net/tracker/index.php?func=detail&aid=1704049&group_id=32953&atid=406583
/**
* Shell command for the DJVU post processor
- * Default: pnmtopng, since ddjvu generates ppm output
+ * Default: pnmtojpeg, since ddjvu generates ppm output
* Set this to false to output the ppm file directly.
*/
$wgDjvuPostProcessor = 'pnmtojpeg';
*/
$wgHideInterlanguageLinks = false;
+/**
+ * List of additional interwiki prefixes that should be treated as
+ * interlanguage links (i.e. placed in the sidebar).
+ * Notes:
+ * - This will not do anything unless the prefixes are defined in the interwiki
+ * map.
+ * - The display text for these custom interlanguage links will be fetched from
+ * the system message "interlanguage-link-xyz" where xyz is the prefix in
+ * this array.
+ * - A friendly name for each site, used for tooltip text, may optionally be
+ * placed in the system message "interlanguage-link-sitename-xyz" where xyz is
+ * the prefix in this array.
+ */
+$wgExtraInterlanguageLinkPrefixes = array();
+
/**
* List of language names or overrides for default names in Names.php
*/
'udp' => 'UDPRCFeedEngine',
);
-/**
- * Enable user search in Special:Newpages
- * This is really a temporary hack around an index install bug on some Wikipedias.
- * Kill it once fixed.
- */
-$wgEnableNewpagesUserFilter = true;
-
/**
* Use RC Patrolling to check for vandalism
*/
* $wgExtensionCredits[$type][] = array(
* 'path' => __FILE__,
* 'name' => 'Example extension',
+ * 'namemsg' => 'exampleextension-name',
* 'author' => array(
* 'Foo Barstein',
* ),
* 'skin', 'api', or 'other', or any additional types as specified through the
* ExtensionTypes hook as used in SpecialVersion::getExtensionTypes().
*
+ * - name: Name of extension as an inline string instead of localizable message.
+ * Do not omit this even if 'namemsg' is provided, as it is used to override
+ * the path Special:Version uses to find extension's license info, and is
+ * required for backwards-compatibility with MediaWiki 1.23 and older.
+ *
+ * - namemsg (since MW 1.24): A message key for a message containing the
+ * extension's name, if the name is localizable. (For example, skin names
+ * usually are.)
+ *
* - author: A string or an array of strings. Authors can be linked using
* the regular wikitext link syntax. To have an internationalized version of
* "and others" show, add an element "...". This element can also be linked,
* for instance "[http://example ...]".
*
* - descriptionmsg: A message key or an an array with message key and parameters:
- * `'descriptionmsg' => array( 'exampleextension-desc', param1, param2, ... ),`
+ * `'descriptionmsg' => 'exampleextension-desc',`
*
- * - description: Description of extension as inline string instead of
+ * - description: Description of extension as an inline string instead of
* localizable message (omit in favour of 'descriptionmsg').
*
* - license-name: Short name of the license (used as label for the link), such
* @param array $environ optional environment variables which should be
* added to the executed command environment.
* @param array $limits Optional array with limits(filesize, memory, time, walltime)
- * this overwrites the global wgShellMax* limits.
+ * this overwrites the global wgMaxShell* limits.
* @return string Collected stdout and stderr as a string
*/
function wfShellExecWithStderr( $cmd, &$retval = null, $environ = array(), $limits = array() ) {
* @since 1.23 Supports CIDR ranges in $wgSquidServersNoPurge
*/
function wfIsConfiguredProxy( $ip ) {
- return IP::isTrustedProxy( $ip );
+ return IP::isConfiguredProxy( $ip );
}
+++ /dev/null
-<?php
-/**
- * Special handling for file description pages.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Class for viewing MediaWiki file description pages
- *
- * @ingroup Media
- */
-class ImagePage extends Article {
- /** @var File */
- private $displayImg;
-
- /** @var FileRepo */
- private $repo;
-
- /** @var bool */
- private $fileLoaded;
-
- /** @var bool */
- protected $mExtraDescription = false;
-
- /**
- * @param Title $title
- * @return WikiFilePage
- */
- protected function newPage( Title $title ) {
- // Overload mPage with a file-specific page
- return new WikiFilePage( $title );
- }
-
- /**
- * Constructor from a page id
- * @param int $id Article ID to load
- * @return ImagePage|null
- */
- public static function newFromID( $id ) {
- $t = Title::newFromID( $id );
- # @todo FIXME: Doesn't inherit right
- return $t == null ? null : new self( $t );
- # return $t == null ? null : new static( $t ); // PHP 5.3
- }
-
- /**
- * @param File $file
- * @return void
- */
- public function setFile( $file ) {
- $this->mPage->setFile( $file );
- $this->displayImg = $file;
- $this->fileLoaded = true;
- }
-
- protected function loadFile() {
- if ( $this->fileLoaded ) {
- return;
- }
- $this->fileLoaded = true;
-
- $this->displayImg = $img = false;
- wfRunHooks( 'ImagePageFindFile', array( $this, &$img, &$this->displayImg ) );
- if ( !$img ) { // not set by hook?
- $img = wfFindFile( $this->getTitle() );
- if ( !$img ) {
- $img = wfLocalFile( $this->getTitle() );
- }
- }
- $this->mPage->setFile( $img );
- if ( !$this->displayImg ) { // not set by hook?
- $this->displayImg = $img;
- }
- $this->repo = $img->getRepo();
- }
-
- /**
- * Handler for action=render
- * Include body text only; none of the image extras
- */
- public function render() {
- $this->getContext()->getOutput()->setArticleBodyOnly( true );
- parent::view();
- }
-
- public function view() {
- global $wgShowEXIF;
-
- $out = $this->getContext()->getOutput();
- $request = $this->getContext()->getRequest();
- $diff = $request->getVal( 'diff' );
- $diffOnly = $request->getBool(
- 'diffonly',
- $this->getContext()->getUser()->getOption( 'diffonly' )
- );
-
- if ( $this->getTitle()->getNamespace() != NS_FILE || ( $diff !== null && $diffOnly ) ) {
- parent::view();
- return;
- }
-
- $this->loadFile();
-
- if ( $this->getTitle()->getNamespace() == NS_FILE && $this->mPage->getFile()->getRedirected() ) {
- if ( $this->getTitle()->getDBkey() == $this->mPage->getFile()->getName() || $diff !== null ) {
- // mTitle is the same as the redirect target so ask Article
- // to perform the redirect for us.
- $request->setVal( 'diffonly', 'true' );
- parent::view();
- return;
- } else {
- // mTitle is not the same as the redirect target so it is
- // probably the redirect page itself. Fake the redirect symbol
- $out->setPageTitle( $this->getTitle()->getPrefixedText() );
- $out->addHTML( $this->viewRedirect(
- Title::makeTitle( NS_FILE, $this->mPage->getFile()->getName() ),
- /* $appendSubtitle */ true,
- /* $forceKnown */ true )
- );
- $this->mPage->doViewUpdates( $this->getContext()->getUser(), $this->getOldID() );
- return;
- }
- }
-
- if ( $wgShowEXIF && $this->displayImg->exists() ) {
- // @todo FIXME: Bad interface, see note on MediaHandler::formatMetadata().
- $formattedMetadata = $this->displayImg->formatMetadata();
- $showmeta = $formattedMetadata !== false;
- } else {
- $showmeta = false;
- }
-
- if ( !$diff && $this->displayImg->exists() ) {
- $out->addHTML( $this->showTOC( $showmeta ) );
- }
-
- if ( !$diff ) {
- $this->openShowImage();
- }
-
- # No need to display noarticletext, we use our own message, output in openShowImage()
- if ( $this->mPage->getID() ) {
- # NS_FILE is in the user language, but this section (the actual wikitext)
- # should be in page content language
- $pageLang = $this->getTitle()->getPageViewLanguage();
- $out->addHTML( Xml::openElement( 'div', array( 'id' => 'mw-imagepage-content',
- 'lang' => $pageLang->getHtmlCode(), 'dir' => $pageLang->getDir(),
- 'class' => 'mw-content-' . $pageLang->getDir() ) ) );
-
- parent::view();
-
- $out->addHTML( Xml::closeElement( 'div' ) );
- } else {
- # Just need to set the right headers
- $out->setArticleFlag( true );
- $out->setPageTitle( $this->getTitle()->getPrefixedText() );
- $this->mPage->doViewUpdates( $this->getContext()->getUser(), $this->getOldID() );
- }
-
- # Show shared description, if needed
- if ( $this->mExtraDescription ) {
- $fol = wfMessage( 'shareddescriptionfollows' );
- if ( !$fol->isDisabled() ) {
- $out->addWikiText( $fol->plain() );
- }
- $out->addHTML( '<div id="shared-image-desc">' . $this->mExtraDescription . "</div>\n" );
- }
-
- $this->closeShowImage();
- $this->imageHistory();
- // TODO: Cleanup the following
-
- $out->addHTML( Xml::element( 'h2',
- array( 'id' => 'filelinks' ),
- wfMessage( 'imagelinks' )->text() ) . "\n" );
- $this->imageDupes();
- # @todo FIXME: For some freaky reason, we can't redirect to foreign images.
- # Yet we return metadata about the target. Definitely an issue in the FileRepo
- $this->imageLinks();
-
- # Allow extensions to add something after the image links
- $html = '';
- wfRunHooks( 'ImagePageAfterImageLinks', array( $this, &$html ) );
- if ( $html ) {
- $out->addHTML( $html );
- }
-
- if ( $showmeta ) {
- $out->addHTML( Xml::element(
- 'h2',
- array( 'id' => 'metadata' ),
- wfMessage( 'metadata' )->text() ) . "\n" );
- $out->addWikiText( $this->makeMetadataTable( $formattedMetadata ) );
- $out->addModules( array( 'mediawiki.action.view.metadata' ) );
- }
-
- // Add remote Filepage.css
- if ( !$this->repo->isLocal() ) {
- $css = $this->repo->getDescriptionStylesheetUrl();
- if ( $css ) {
- $out->addStyle( $css );
- }
- }
- // always show the local local Filepage.css, bug 29277
- $out->addModuleStyles( 'filepage' );
- }
-
- /**
- * @return File
- */
- public function getDisplayedFile() {
- $this->loadFile();
- return $this->displayImg;
- }
-
- /**
- * Create the TOC
- *
- * @param bool $metadata Whether or not to show the metadata link
- * @return string
- */
- protected function showTOC( $metadata ) {
- $r = array(
- '<li><a href="#file">' . wfMessage( 'file-anchor-link' )->escaped() . '</a></li>',
- '<li><a href="#filehistory">' . wfMessage( 'filehist' )->escaped() . '</a></li>',
- '<li><a href="#filelinks">' . wfMessage( 'imagelinks' )->escaped() . '</a></li>',
- );
- if ( $metadata ) {
- $r[] = '<li><a href="#metadata">' . wfMessage( 'metadata' )->escaped() . '</a></li>';
- }
-
- wfRunHooks( 'ImagePageShowTOC', array( $this, &$r ) );
-
- return '<ul id="filetoc">' . implode( "\n", $r ) . '</ul>';
- }
-
- /**
- * Make a table with metadata to be shown in the output page.
- *
- * @todo FIXME: Bad interface, see note on MediaHandler::formatMetadata().
- *
- * @param array $metadata The array containing the Exif data
- * @return string The metadata table. This is treated as Wikitext (!)
- */
- protected function makeMetadataTable( $metadata ) {
- $r = "<div class=\"mw-imagepage-section-metadata\">";
- $r .= wfMessage( 'metadata-help' )->plain();
- $r .= "<table id=\"mw_metadata\" class=\"mw_metadata\">\n";
- foreach ( $metadata as $type => $stuff ) {
- foreach ( $stuff as $v ) {
- # @todo FIXME: Why is this using escapeId for a class?!
- $class = Sanitizer::escapeId( $v['id'] );
- if ( $type == 'collapsed' ) {
- // Handled by mediawiki.action.view.metadata module
- // and skins/common/shared.css.
- $class .= ' collapsable';
- }
- $r .= "<tr class=\"$class\">\n";
- $r .= "<th>{$v['name']}</th>\n";
- $r .= "<td>{$v['value']}</td>\n</tr>";
- }
- }
- $r .= "</table>\n</div>\n";
- return $r;
- }
-
- /**
- * Overloading Article's getContentObject method.
- *
- * Omit noarticletext if sharedupload; text will be fetched from the
- * shared upload server if possible.
- * @return string
- */
- public function getContentObject() {
- $this->loadFile();
- if ( $this->mPage->getFile() && !$this->mPage->getFile()->isLocal() && 0 == $this->getID() ) {
- return null;
- }
- return parent::getContentObject();
- }
-
- protected function openShowImage() {
- global $wgImageLimits, $wgEnableUploads, $wgSend404Code;
-
- $this->loadFile();
- $out = $this->getContext()->getOutput();
- $user = $this->getContext()->getUser();
- $lang = $this->getContext()->getLanguage();
- $dirmark = $lang->getDirMarkEntity();
- $request = $this->getContext()->getRequest();
-
- $max = $this->getImageLimitsFromOption( $user, 'imagesize' );
- $maxWidth = $max[0];
- $maxHeight = $max[1];
-
- if ( $this->displayImg->exists() ) {
- # image
- $page = $request->getIntOrNull( 'page' );
- if ( is_null( $page ) ) {
- $params = array();
- $page = 1;
- } else {
- $params = array( 'page' => $page );
- }
-
- $renderLang = $request->getVal( 'lang' );
- if ( !is_null( $renderLang ) ) {
- $handler = $this->displayImg->getHandler();
- if ( $handler && $handler->validateParam( 'lang', $renderLang ) ) {
- $params['lang'] = $renderLang;
- } else {
- $renderLang = null;
- }
- }
-
- $width_orig = $this->displayImg->getWidth( $page );
- $width = $width_orig;
- $height_orig = $this->displayImg->getHeight( $page );
- $height = $height_orig;
-
- $filename = wfEscapeWikiText( $this->displayImg->getName() );
- $linktext = $filename;
-
- wfRunHooks( 'ImageOpenShowImageInlineBefore', array( &$this, &$out ) );
-
- if ( $this->displayImg->allowInlineDisplay() ) {
- # image
-
- # "Download high res version" link below the image
- # $msgsize = wfMessage( 'file-info-size', $width_orig, $height_orig,
- # Linker::formatSize( $this->displayImg->getSize() ), $mime )->escaped();
- # We'll show a thumbnail of this image
- if ( $width > $maxWidth || $height > $maxHeight ) {
- # Calculate the thumbnail size.
- # First case, the limiting factor is the width, not the height.
- /** @todo // FIXME: Possible division by 0. bug 36911 */
- if ( $width / $height >= $maxWidth / $maxHeight ) {
- /** @todo // FIXME: Possible division by 0. bug 36911 */
- $height = round( $height * $maxWidth / $width );
- $width = $maxWidth;
- # Note that $height <= $maxHeight now.
- } else {
- /** @todo // FIXME: Possible division by 0. bug 36911 */
- $newwidth = floor( $width * $maxHeight / $height );
- /** @todo // FIXME: Possible division by 0. bug 36911 */
- $height = round( $height * $newwidth / $width );
- $width = $newwidth;
- # Note that $height <= $maxHeight now, but might not be identical
- # because of rounding.
- }
- $linktext = wfMessage( 'show-big-image' )->escaped();
- if ( $this->displayImg->getRepo()->canTransformVia404() ) {
- $thumbSizes = $wgImageLimits;
- // Also include the full sized resolution in the list, so
- // that users know they can get it. This will link to the
- // original file asset if mustRender() === false. In the case
- // that we mustRender, some users have indicated that they would
- // find it useful to have the full size image in the rendered
- // image format.
- $thumbSizes[] = array( $width_orig, $height_orig );
- } else {
- # Creating thumb links triggers thumbnail generation.
- # Just generate the thumb for the current users prefs.
- $thumbSizes = array( $this->getImageLimitsFromOption( $user, 'thumbsize' ) );
- if ( !$this->displayImg->mustRender() ) {
- // We can safely include a link to the "full-size" preview,
- // without actually rendering.
- $thumbSizes[] = array( $width_orig, $height_orig );
- }
- }
- # Generate thumbnails or thumbnail links as needed...
- $otherSizes = array();
- foreach ( $thumbSizes as $size ) {
- // We include a thumbnail size in the list, if it is
- // less than or equal to the original size of the image
- // asset ($width_orig/$height_orig). We also exclude
- // the current thumbnail's size ($width/$height)
- // since that is added to the message separately, so
- // it can be denoted as the current size being shown.
- if ( $size[0] <= $width_orig && $size[1] <= $height_orig
- && $size[0] != $width && $size[1] != $height
- ) {
- $sizeLink = $this->makeSizeLink( $params, $size[0], $size[1] );
- if ( $sizeLink ) {
- $otherSizes[] = $sizeLink;
- }
- }
- }
- $otherSizes = array_unique( $otherSizes );
- $msgsmall = '';
- $sizeLinkBigImagePreview = $this->makeSizeLink( $params, $width, $height );
- if ( $sizeLinkBigImagePreview ) {
- $msgsmall .= wfMessage( 'show-big-image-preview' )->
- rawParams( $sizeLinkBigImagePreview )->
- parse();
- }
- if ( count( $otherSizes ) ) {
- $msgsmall .= ' ' .
- Html::rawElement( 'span', array( 'class' => 'mw-filepage-other-resolutions' ),
- wfMessage( 'show-big-image-other' )->rawParams( $lang->pipeList( $otherSizes ) )->
- params( count( $otherSizes ) )->parse()
- );
- }
- } elseif ( $width == 0 && $height == 0 ) {
- # Some sort of audio file that doesn't have dimensions
- # Don't output a no hi res message for such a file
- $msgsmall = '';
- } elseif ( $this->displayImg->isVectorized() ) {
- # For vectorized images, full size is just the frame size
- $msgsmall = '';
- } else {
- # Image is small enough to show full size on image page
- $msgsmall = wfMessage( 'file-nohires' )->parse();
- }
-
- $params['width'] = $width;
- $params['height'] = $height;
- $thumbnail = $this->displayImg->transform( $params );
- Linker::processResponsiveImages( $this->displayImg, $thumbnail, $params );
-
- $anchorclose = Html::rawElement(
- 'div',
- array( 'class' => 'mw-filepage-resolutioninfo' ),
- $msgsmall
- );
-
- $isMulti = $this->displayImg->isMultipage() && $this->displayImg->pageCount() > 1;
- if ( $isMulti ) {
- $out->addModules( 'mediawiki.page.image.pagination' );
- $out->addHTML( '<table class="multipageimage"><tr><td>' );
- }
-
- if ( $thumbnail ) {
- $options = array(
- 'alt' => $this->displayImg->getTitle()->getPrefixedText(),
- 'file-link' => true,
- );
- $out->addHTML( '<div class="fullImageLink" id="file">' .
- $thumbnail->toHtml( $options ) .
- $anchorclose . "</div>\n" );
- }
-
- if ( $isMulti ) {
- $count = $this->displayImg->pageCount();
-
- if ( $page > 1 ) {
- $label = $out->parse( wfMessage( 'imgmultipageprev' )->text(), false );
- $link = Linker::linkKnown(
- $this->getTitle(),
- $label,
- array(),
- array( 'page' => $page - 1 )
- );
- $thumb1 = Linker::makeThumbLinkObj(
- $this->getTitle(),
- $this->displayImg,
- $link,
- $label,
- 'none',
- array( 'page' => $page - 1 )
- );
- } else {
- $thumb1 = '';
- }
-
- if ( $page < $count ) {
- $label = wfMessage( 'imgmultipagenext' )->text();
- $link = Linker::linkKnown(
- $this->getTitle(),
- $label,
- array(),
- array( 'page' => $page + 1 )
- );
- $thumb2 = Linker::makeThumbLinkObj(
- $this->getTitle(),
- $this->displayImg,
- $link,
- $label,
- 'none',
- array( 'page' => $page + 1 )
- );
- } else {
- $thumb2 = '';
- }
-
- global $wgScript;
-
- $formParams = array(
- 'name' => 'pageselector',
- 'action' => $wgScript,
- );
- $options = array();
- for ( $i = 1; $i <= $count; $i++ ) {
- $options[] = Xml::option( $lang->formatNum( $i ), $i, $i == $page );
- }
- $select = Xml::tags( 'select',
- array( 'id' => 'pageselector', 'name' => 'page' ),
- implode( "\n", $options ) );
-
- $out->addHTML(
- '</td><td><div class="multipageimagenavbox">' .
- Xml::openElement( 'form', $formParams ) .
- Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
- wfMessage( 'imgmultigoto' )->rawParams( $select )->parse() .
- Xml::submitButton( wfMessage( 'imgmultigo' )->text() ) .
- Xml::closeElement( 'form' ) .
- "<hr />$thumb1\n$thumb2<br style=\"clear: both\" /></div></td></tr></table>"
- );
- }
- } elseif ( $this->displayImg->isSafeFile() ) {
- # if direct link is allowed but it's not a renderable image, show an icon.
- $icon = $this->displayImg->iconThumb();
-
- $out->addHTML( '<div class="fullImageLink" id="file">' .
- $icon->toHtml( array( 'file-link' => true ) ) .
- "</div>\n" );
- }
-
- $longDesc = wfMessage( 'parentheses', $this->displayImg->getLongDesc() )->text();
-
- $medialink = "[[Media:$filename|$linktext]]";
-
- if ( !$this->displayImg->isSafeFile() ) {
- $warning = wfMessage( 'mediawarning' )->plain();
- // dirmark is needed here to separate the file name, which
- // most likely ends in Latin characters, from the description,
- // which may begin with the file type. In RTL environment
- // this will get messy.
- // The dirmark, however, must not be immediately adjacent
- // to the filename, because it can get copied with it.
- // See bug 25277.
- // @codingStandardsIgnoreStart Ignore long line
- $out->addWikiText( <<<EOT
-<div class="fullMedia"><span class="dangerousLink">{$medialink}</span> $dirmark<span class="fileInfo">$longDesc</span></div>
-<div class="mediaWarning">$warning</div>
-EOT
- );
- // @codingStandardsIgnoreEnd
- } else {
- $out->addWikiText( <<<EOT
-<div class="fullMedia">{$medialink} {$dirmark}<span class="fileInfo">$longDesc</span>
-</div>
-EOT
- );
- }
-
- $renderLangOptions = $this->displayImg->getAvailableLanguages();
- if ( count( $renderLangOptions ) >= 1 ) {
- $currentLanguage = $renderLang;
- $defaultLang = $this->displayImg->getDefaultRenderLanguage();
- if ( is_null( $currentLanguage ) ) {
- $currentLanguage = $defaultLang;
- }
- $out->addHtml( $this->doRenderLangOpt( $renderLangOptions, $currentLanguage, $defaultLang ) );
- }
-
- // Add cannot animate thumbnail warning
- if ( !$this->displayImg->canAnimateThumbIfAppropriate() ) {
- // Include the extension so wiki admins can
- // customize it on a per file-type basis
- // (aka say things like use format X instead).
- // additionally have a specific message for
- // file-no-thumb-animation-gif
- $ext = $this->displayImg->getExtension();
- $noAnimMesg = wfMessageFallback(
- 'file-no-thumb-animation-' . $ext,
- 'file-no-thumb-animation'
- )->plain();
-
- $out->addWikiText( <<<EOT
-<div class="mw-noanimatethumb">{$noAnimMesg}</div>
-EOT
- );
- }
-
- if ( !$this->displayImg->isLocal() ) {
- $this->printSharedImageText();
- }
- } else {
- # Image does not exist
- if ( !$this->getID() ) {
- # No article exists either
- # Show deletion log to be consistent with normal articles
- LogEventsList::showLogExtract(
- $out,
- array( 'delete', 'move' ),
- $this->getTitle()->getPrefixedText(),
- '',
- array( 'lim' => 10,
- 'conds' => array( "log_action != 'revision'" ),
- 'showIfEmpty' => false,
- 'msgKey' => array( 'moveddeleted-notice' )
- )
- );
- }
-
- if ( $wgEnableUploads && $user->isAllowed( 'upload' ) ) {
- // Only show an upload link if the user can upload
- $uploadTitle = SpecialPage::getTitleFor( 'Upload' );
- $nofile = array(
- 'filepage-nofile-link',
- $uploadTitle->getFullURL( array( 'wpDestFile' => $this->mPage->getFile()->getName() ) )
- );
- } else {
- $nofile = 'filepage-nofile';
- }
- // Note, if there is an image description page, but
- // no image, then this setRobotPolicy is overridden
- // by Article::View().
- $out->setRobotPolicy( 'noindex,nofollow' );
- $out->wrapWikiMsg( "<div id='mw-imagepage-nofile' class='plainlinks'>\n$1\n</div>", $nofile );
- if ( !$this->getID() && $wgSend404Code ) {
- // If there is no image, no shared image, and no description page,
- // output a 404, to be consistent with articles.
- $request->response()->header( 'HTTP/1.1 404 Not Found' );
- }
- }
- $out->setFileVersion( $this->displayImg );
- }
-
- /**
- * Creates an thumbnail of specified size and returns an HTML link to it
- * @param array $params Scaler parameters
- * @param int $width
- * @param int $height
- * @return string
- */
- private function makeSizeLink( $params, $width, $height ) {
- $params['width'] = $width;
- $params['height'] = $height;
- $thumbnail = $this->displayImg->transform( $params );
- if ( $thumbnail && !$thumbnail->isError() ) {
- return Html::rawElement( 'a', array(
- 'href' => $thumbnail->getUrl(),
- 'class' => 'mw-thumbnail-link'
- ), wfMessage( 'show-big-image-size' )->numParams(
- $thumbnail->getWidth(), $thumbnail->getHeight()
- )->parse() );
- } else {
- return '';
- }
- }
-
- /**
- * Show a notice that the file is from a shared repository
- */
- protected function printSharedImageText() {
- $out = $this->getContext()->getOutput();
- $this->loadFile();
-
- $descUrl = $this->mPage->getFile()->getDescriptionUrl();
- $descText = $this->mPage->getFile()->getDescriptionText( $this->getContext()->getLanguage() );
-
- /* Add canonical to head if there is no local page for this shared file */
- if ( $descUrl && $this->mPage->getID() == 0 ) {
- $out->setCanonicalUrl( $descUrl );
- }
-
- $wrap = "<div class=\"sharedUploadNotice\">\n$1\n</div>\n";
- $repo = $this->mPage->getFile()->getRepo()->getDisplayName();
-
- if ( $descUrl && $descText && wfMessage( 'sharedupload-desc-here' )->plain() !== '-' ) {
- $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
- } elseif ( $descUrl && wfMessage( 'sharedupload-desc-there' )->plain() !== '-' ) {
- $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
- } else {
- $out->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
- }
-
- if ( $descText ) {
- $this->mExtraDescription = $descText;
- }
- }
-
- public function getUploadUrl() {
- $this->loadFile();
- $uploadTitle = SpecialPage::getTitleFor( 'Upload' );
- return $uploadTitle->getFullURL( array(
- 'wpDestFile' => $this->mPage->getFile()->getName(),
- 'wpForReUpload' => 1
- ) );
- }
-
- /**
- * Print out the various links at the bottom of the image page, e.g. reupload,
- * external editing (and instructions link) etc.
- */
- protected function uploadLinksBox() {
- global $wgEnableUploads;
-
- if ( !$wgEnableUploads ) {
- return;
- }
-
- $this->loadFile();
- if ( !$this->mPage->getFile()->isLocal() ) {
- return;
- }
-
- $out = $this->getContext()->getOutput();
- $out->addHTML( "<ul>\n" );
-
- # "Upload a new version of this file" link
- $canUpload = $this->getTitle()->userCan( 'upload', $this->getContext()->getUser() );
- if ( $canUpload && UploadBase::userCanReUpload(
- $this->getContext()->getUser(),
- $this->mPage->getFile()->name )
- ) {
- $ulink = Linker::makeExternalLink(
- $this->getUploadUrl(),
- wfMessage( 'uploadnewversion-linktext' )->text()
- );
- $out->addHTML( "<li id=\"mw-imagepage-reupload-link\">"
- . "<div class=\"plainlinks\">{$ulink}</div></li>\n" );
- } else {
- $out->addHTML( "<li id=\"mw-imagepage-upload-disallowed\">"
- . $this->getContext()->msg( 'upload-disallowed-here' )->escaped() . "</li>\n" );
- }
-
- $out->addHTML( "</ul>\n" );
- }
-
- /**
- * For overloading
- */
- protected function closeShowImage() {
- }
-
- /**
- * If the page we've just displayed is in the "Image" namespace,
- * we follow it with an upload history of the image and its usage.
- */
- protected function imageHistory() {
- $this->loadFile();
- $out = $this->getContext()->getOutput();
- $pager = new ImageHistoryPseudoPager( $this );
- $out->addHTML( $pager->getBody() );
- $out->preventClickjacking( $pager->getPreventClickjacking() );
-
- $this->mPage->getFile()->resetHistory(); // free db resources
-
- # Exist check because we don't want to show this on pages where an image
- # doesn't exist along with the noimage message, that would suck. -ævar
- if ( $this->mPage->getFile()->exists() ) {
- $this->uploadLinksBox();
- }
- }
-
- /**
- * @param string $target
- * @param int $limit
- * @return ResultWrapper
- */
- protected function queryImageLinks( $target, $limit ) {
- $dbr = wfGetDB( DB_SLAVE );
-
- return $dbr->select(
- array( 'imagelinks', 'page' ),
- array( 'page_namespace', 'page_title', 'il_to' ),
- array( 'il_to' => $target, 'il_from = page_id' ),
- __METHOD__,
- array( 'LIMIT' => $limit + 1, 'ORDER BY' => 'il_from', )
- );
- }
-
- protected function imageLinks() {
- $limit = 100;
-
- $out = $this->getContext()->getOutput();
-
- $rows = array();
- $redirects = array();
- foreach ( $this->getTitle()->getRedirectsHere( NS_FILE ) as $redir ) {
- $redirects[$redir->getDBkey()] = array();
- $rows[] = (object)array(
- 'page_namespace' => NS_FILE,
- 'page_title' => $redir->getDBkey(),
- );
- }
-
- $res = $this->queryImageLinks( $this->getTitle()->getDBkey(), $limit + 1 );
- foreach ( $res as $row ) {
- $rows[] = $row;
- }
- $count = count( $rows );
-
- $hasMore = $count > $limit;
- if ( !$hasMore && count( $redirects ) ) {
- $res = $this->queryImageLinks( array_keys( $redirects ),
- $limit - count( $rows ) + 1 );
- foreach ( $res as $row ) {
- $redirects[$row->il_to][] = $row;
- $count++;
- }
- $hasMore = ( $res->numRows() + count( $rows ) ) > $limit;
- }
-
- if ( $count == 0 ) {
- $out->wrapWikiMsg(
- Html::rawElement( 'div',
- array( 'id' => 'mw-imagepage-nolinkstoimage' ), "\n$1\n" ),
- 'nolinkstoimage'
- );
- return;
- }
-
- $out->addHTML( "<div id='mw-imagepage-section-linkstoimage'>\n" );
- if ( !$hasMore ) {
- $out->addWikiMsg( 'linkstoimage', $count );
- } else {
- // More links than the limit. Add a link to [[Special:Whatlinkshere]]
- $out->addWikiMsg( 'linkstoimage-more',
- $this->getContext()->getLanguage()->formatNum( $limit ),
- $this->getTitle()->getPrefixedDBkey()
- );
- }
-
- $out->addHTML(
- Html::openElement( 'ul',
- array( 'class' => 'mw-imagepage-linkstoimage' ) ) . "\n"
- );
- $count = 0;
-
- // Sort the list by namespace:title
- usort( $rows, array( $this, 'compare' ) );
-
- // Create links for every element
- $currentCount = 0;
- foreach ( $rows as $element ) {
- $currentCount++;
- if ( $currentCount > $limit ) {
- break;
- }
-
- $query = array();
- # Add a redirect=no to make redirect pages reachable
- if ( isset( $redirects[$element->page_title] ) ) {
- $query['redirect'] = 'no';
- }
- $link = Linker::linkKnown(
- Title::makeTitle( $element->page_namespace, $element->page_title ),
- null, array(), $query
- );
- if ( !isset( $redirects[$element->page_title] ) ) {
- # No redirects
- $liContents = $link;
- } elseif ( count( $redirects[$element->page_title] ) === 0 ) {
- # Redirect without usages
- $liContents = wfMessage( 'linkstoimage-redirect' )->rawParams( $link, '' )->parse();
- } else {
- # Redirect with usages
- $li = '';
- foreach ( $redirects[$element->page_title] as $row ) {
- $currentCount++;
- if ( $currentCount > $limit ) {
- break;
- }
-
- $link2 = Linker::linkKnown( Title::makeTitle( $row->page_namespace, $row->page_title ) );
- $li .= Html::rawElement(
- 'li',
- array( 'class' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
- $link2
- ) . "\n";
- }
-
- $ul = Html::rawElement(
- 'ul',
- array( 'class' => 'mw-imagepage-redirectstofile' ),
- $li
- ) . "\n";
- $liContents = wfMessage( 'linkstoimage-redirect' )->rawParams(
- $link, $ul )->parse();
- }
- $out->addHTML( Html::rawElement(
- 'li',
- array( 'class' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
- $liContents
- ) . "\n"
- );
-
- };
- $out->addHTML( Html::closeElement( 'ul' ) . "\n" );
- $res->free();
-
- // Add a links to [[Special:Whatlinkshere]]
- if ( $count > $limit ) {
- $out->addWikiMsg( 'morelinkstoimage', $this->getTitle()->getPrefixedDBkey() );
- }
- $out->addHTML( Html::closeElement( 'div' ) . "\n" );
- }
-
- protected function imageDupes() {
- $this->loadFile();
- $out = $this->getContext()->getOutput();
-
- $dupes = $this->mPage->getDuplicates();
- if ( count( $dupes ) == 0 ) {
- return;
- }
-
- $out->addHTML( "<div id='mw-imagepage-section-duplicates'>\n" );
- $out->addWikiMsg( 'duplicatesoffile',
- $this->getContext()->getLanguage()->formatNum( count( $dupes ) ), $this->getTitle()->getDBkey()
- );
- $out->addHTML( "<ul class='mw-imagepage-duplicates'>\n" );
-
- /**
- * @var $file File
- */
- foreach ( $dupes as $file ) {
- $fromSrc = '';
- if ( $file->isLocal() ) {
- $link = Linker::linkKnown( $file->getTitle() );
- } else {
- $link = Linker::makeExternalLink( $file->getDescriptionUrl(),
- $file->getTitle()->getPrefixedText() );
- $fromSrc = wfMessage( 'shared-repo-from', $file->getRepo()->getDisplayName() )->text();
- }
- $out->addHTML( "<li>{$link} {$fromSrc}</li>\n" );
- }
- $out->addHTML( "</ul></div>\n" );
- }
-
- /**
- * Delete the file, or an earlier version of it
- */
- public function delete() {
- $file = $this->mPage->getFile();
- if ( !$file->exists() || !$file->isLocal() || $file->getRedirected() ) {
- // Standard article deletion
- parent::delete();
- return;
- }
-
- $deleter = new FileDeleteForm( $file );
- $deleter->execute();
- }
-
- /**
- * Display an error with a wikitext description
- *
- * @param string $description
- */
- function showError( $description ) {
- $out = $this->getContext()->getOutput();
- $out->setPageTitle( wfMessage( 'internalerror' ) );
- $out->setRobotPolicy( 'noindex,nofollow' );
- $out->setArticleRelated( false );
- $out->enableClientCache( false );
- $out->addWikiText( $description );
- }
-
- /**
- * Callback for usort() to do link sorts by (namespace, title)
- * Function copied from Title::compare()
- *
- * @param object $a Object page to compare with
- * @param object $b Object page to compare with
- * @return int Result of string comparison, or namespace comparison
- */
- protected function compare( $a, $b ) {
- if ( $a->page_namespace == $b->page_namespace ) {
- return strcmp( $a->page_title, $b->page_title );
- } else {
- return $a->page_namespace - $b->page_namespace;
- }
- }
-
- /**
- * Returns the corresponding $wgImageLimits entry for the selected user option
- *
- * @param User $user
- * @param string $optionName Name of a option to check, typically imagesize or thumbsize
- * @return array
- * @since 1.21
- */
- public function getImageLimitsFromOption( $user, $optionName ) {
- global $wgImageLimits;
-
- $option = $user->getIntOption( $optionName );
- if ( !isset( $wgImageLimits[$option] ) ) {
- $option = User::getDefaultOption( $optionName );
- }
-
- // The user offset might still be incorrect, specially if
- // $wgImageLimits got changed (see bug #8858).
- if ( !isset( $wgImageLimits[$option] ) ) {
- // Default to the first offset in $wgImageLimits
- $option = 0;
- }
-
- return isset( $wgImageLimits[$option] )
- ? $wgImageLimits[$option]
- : array( 800, 600 ); // if nothing is set, fallback to a hardcoded default
- }
-
- /**
- * Output a drop-down box for language options for the file
- *
- * @param array $langChoices Array of string language codes
- * @param string $curLang Language code file is being viewed in.
- * @param string $defaultLang Language code that image is rendered in by default
- * @return string HTML to insert underneath image.
- */
- protected function doRenderLangOpt( array $langChoices, $curLang, $defaultLang ) {
- global $wgScript;
- sort( $langChoices );
- $curLang = wfBCP47( $curLang );
- $defaultLang = wfBCP47( $defaultLang );
- $opts = '';
- $haveCurrentLang = false;
- $haveDefaultLang = false;
-
- // We make a list of all the language choices in the file.
- // Additionally if the default language to render this file
- // is not included as being in this file (for example, in svgs
- // usually the fallback content is the english content) also
- // include a choice for that. Last of all, if we're viewing
- // the file in a language not on the list, add it as a choice.
- foreach ( $langChoices as $lang ) {
- $code = wfBCP47( $lang );
- $name = Language::fetchLanguageName( $code, $this->getContext()->getLanguage()->getCode() );
- if ( $name !== '' ) {
- $display = wfMessage( 'img-lang-opt', $code, $name )->text();
- } else {
- $display = $code;
- }
- $opts .= "\n" . Xml::option( $display, $code, $curLang === $code );
- if ( $curLang === $code ) {
- $haveCurrentLang = true;
- }
- if ( $defaultLang === $code ) {
- $haveDefaultLang = true;
- }
- }
- if ( !$haveDefaultLang ) {
- // Its hard to know if the content is really in the default language, or
- // if its just unmarked content that could be in any language.
- $opts = Xml::option(
- wfMessage( 'img-lang-default' )->text(),
- $defaultLang,
- $defaultLang === $curLang
- ) . $opts;
- }
- if ( !$haveCurrentLang && $defaultLang !== $curLang ) {
- $name = Language::fetchLanguageName( $curLang, $this->getContext()->getLanguage()->getCode() );
- if ( $name !== '' ) {
- $display = wfMessage( 'img-lang-opt', $curLang, $name )->text();
- } else {
- $display = $curLang;
- }
- $opts = Xml::option( $display, $curLang, true ) . $opts;
- }
-
- $select = Html::rawElement(
- 'select',
- array( 'id' => 'mw-imglangselector', 'name' => 'lang' ),
- $opts
- );
- $submit = Xml::submitButton( wfMessage( 'img-lang-go' )->text() );
-
- $formContents = wfMessage( 'img-lang-info' )->rawParams( $select, $submit )->parse()
- . Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() );
-
- $langSelectLine = Html::rawElement( 'div', array( 'id' => 'mw-imglangselector-line' ),
- Html::rawElement( 'form', array( 'action' => $wgScript ), $formContents )
- );
- return $langSelectLine;
- }
-}
-
-/**
- * Builds the image revision log shown on image pages
- *
- * @ingroup Media
- */
-class ImageHistoryList extends ContextSource {
-
- /**
- * @var Title
- */
- protected $title;
-
- /**
- * @var File
- */
- protected $img;
-
- /**
- * @var ImagePage
- */
- protected $imagePage;
-
- /**
- * @var File
- */
- protected $current;
-
- protected $repo, $showThumb;
- protected $preventClickjacking = false;
-
- /**
- * @param ImagePage $imagePage
- */
- public function __construct( $imagePage ) {
- global $wgShowArchiveThumbnails;
- $this->current = $imagePage->getFile();
- $this->img = $imagePage->getDisplayedFile();
- $this->title = $imagePage->getTitle();
- $this->imagePage = $imagePage;
- $this->showThumb = $wgShowArchiveThumbnails && $this->img->canRender();
- $this->setContext( $imagePage->getContext() );
- }
-
- /**
- * @return ImagePage
- */
- public function getImagePage() {
- return $this->imagePage;
- }
-
- /**
- * @return File
- */
- public function getFile() {
- return $this->img;
- }
-
- /**
- * @param string $navLinks
- * @return string
- */
- public function beginImageHistoryList( $navLinks = '' ) {
- return Xml::element( 'h2', array( 'id' => 'filehistory' ), $this->msg( 'filehist' )->text() )
- . "\n"
- . "<div id=\"mw-imagepage-section-filehistory\">\n"
- . $this->msg( 'filehist-help' )->parseAsBlock()
- . $navLinks . "\n"
- . Xml::openElement( 'table', array( 'class' => 'wikitable filehistory' ) ) . "\n"
- . '<tr><td></td>'
- . ( $this->current->isLocal()
- && ( $this->getUser()->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '<td></td>' : '' )
- . '<th>' . $this->msg( 'filehist-datetime' )->escaped() . '</th>'
- . ( $this->showThumb ? '<th>' . $this->msg( 'filehist-thumb' )->escaped() . '</th>' : '' )
- . '<th>' . $this->msg( 'filehist-dimensions' )->escaped() . '</th>'
- . '<th>' . $this->msg( 'filehist-user' )->escaped() . '</th>'
- . '<th>' . $this->msg( 'filehist-comment' )->escaped() . '</th>'
- . "</tr>\n";
- }
-
- /**
- * @param string $navLinks
- * @return string
- */
- public function endImageHistoryList( $navLinks = '' ) {
- return "</table>\n$navLinks\n</div>\n";
- }
-
- /**
- * @param bool $iscur
- * @param File $file
- * @return string
- */
- public function imageHistoryLine( $iscur, $file ) {
- global $wgContLang;
-
- $user = $this->getUser();
- $lang = $this->getLanguage();
- $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() );
- $img = $iscur ? $file->getName() : $file->getArchiveName();
- $userId = $file->getUser( 'id' );
- $userText = $file->getUser( 'text' );
- $description = $file->getDescription( File::FOR_THIS_USER, $user );
-
- $local = $this->current->isLocal();
- $row = $selected = '';
-
- // Deletion link
- if ( $local && ( $user->isAllowedAny( 'delete', 'deletedhistory' ) ) ) {
- $row .= '<td>';
- # Link to remove from history
- if ( $user->isAllowed( 'delete' ) ) {
- $q = array( 'action' => 'delete' );
- if ( !$iscur ) {
- $q['oldimage'] = $img;
- }
- $row .= Linker::linkKnown(
- $this->title,
- $this->msg( $iscur ? 'filehist-deleteall' : 'filehist-deleteone' )->escaped(),
- array(), $q
- );
- }
- # Link to hide content. Don't show useless link to people who cannot hide revisions.
- $canHide = $user->isAllowed( 'deleterevision' );
- if ( $canHide || ( $user->isAllowed( 'deletedhistory' ) && $file->getVisibility() ) ) {
- if ( $user->isAllowed( 'delete' ) ) {
- $row .= '<br />';
- }
- // If file is top revision or locked from this user, don't link
- if ( $iscur || !$file->userCan( File::DELETED_RESTRICTED, $user ) ) {
- $del = Linker::revDeleteLinkDisabled( $canHide );
- } else {
- list( $ts, ) = explode( '!', $img, 2 );
- $query = array(
- 'type' => 'oldimage',
- 'target' => $this->title->getPrefixedText(),
- 'ids' => $ts,
- );
- $del = Linker::revDeleteLink( $query,
- $file->isDeleted( File::DELETED_RESTRICTED ), $canHide );
- }
- $row .= $del;
- }
- $row .= '</td>';
- }
-
- // Reversion link/current indicator
- $row .= '<td>';
- if ( $iscur ) {
- $row .= $this->msg( 'filehist-current' )->escaped();
- } elseif ( $local && $this->title->quickUserCan( 'edit', $user )
- && $this->title->quickUserCan( 'upload', $user )
- ) {
- if ( $file->isDeleted( File::DELETED_FILE ) ) {
- $row .= $this->msg( 'filehist-revert' )->escaped();
- } else {
- $row .= Linker::linkKnown(
- $this->title,
- $this->msg( 'filehist-revert' )->escaped(),
- array(),
- array(
- 'action' => 'revert',
- 'oldimage' => $img,
- 'wpEditToken' => $user->getEditToken( $img )
- )
- );
- }
- }
- $row .= '</td>';
-
- // Date/time and image link
- if ( $file->getTimestamp() === $this->img->getTimestamp() ) {
- $selected = "class='filehistory-selected'";
- }
- $row .= "<td $selected style='white-space: nowrap;'>";
- if ( !$file->userCan( File::DELETED_FILE, $user ) ) {
- # Don't link to unviewable files
- $row .= '<span class="history-deleted">'
- . $lang->userTimeAndDate( $timestamp, $user ) . '</span>';
- } elseif ( $file->isDeleted( File::DELETED_FILE ) ) {
- if ( $local ) {
- $this->preventClickjacking();
- $revdel = SpecialPage::getTitleFor( 'Revisiondelete' );
- # Make a link to review the image
- $url = Linker::linkKnown(
- $revdel,
- $lang->userTimeAndDate( $timestamp, $user ),
- array(),
- array(
- 'target' => $this->title->getPrefixedText(),
- 'file' => $img,
- 'token' => $user->getEditToken( $img )
- )
- );
- } else {
- $url = $lang->userTimeAndDate( $timestamp, $user );
- }
- $row .= '<span class="history-deleted">' . $url . '</span>';
- } else {
- $url = $iscur ? $this->current->getUrl() : $this->current->getArchiveUrl( $img );
- $row .= Xml::element(
- 'a',
- array( 'href' => $url ),
- $lang->userTimeAndDate( $timestamp, $user )
- );
- }
- $row .= "</td>";
-
- // Thumbnail
- if ( $this->showThumb ) {
- $row .= '<td>' . $this->getThumbForLine( $file ) . '</td>';
- }
-
- // Image dimensions + size
- $row .= '<td>';
- $row .= htmlspecialchars( $file->getDimensionsString() );
- $row .= $this->msg( 'word-separator' )->escaped();
- $row .= '<span style="white-space: nowrap;">';
- $row .= $this->msg( 'parentheses' )->sizeParams( $file->getSize() )->escaped();
- $row .= '</span>';
- $row .= '</td>';
-
- // Uploading user
- $row .= '<td>';
- // Hide deleted usernames
- if ( $file->isDeleted( File::DELETED_USER ) ) {
- $row .= '<span class="history-deleted">'
- . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
- } else {
- if ( $local ) {
- $row .= Linker::userLink( $userId, $userText );
- $row .= $this->msg( 'word-separator' )->escaped();
- $row .= '<span style="white-space: nowrap;">';
- $row .= Linker::userToolLinks( $userId, $userText );
- $row .= '</span>';
- } else {
- $row .= htmlspecialchars( $userText );
- }
- }
- $row .= '</td>';
-
- // Don't show deleted descriptions
- if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
- $row .= '<td><span class="history-deleted">' .
- $this->msg( 'rev-deleted-comment' )->escaped() . '</span></td>';
- } else {
- $row .= '<td dir="' . $wgContLang->getDir() . '">' .
- Linker::formatComment( $description, $this->title ) . '</td>';
- }
-
- $rowClass = null;
- wfRunHooks( 'ImagePageFileHistoryLine', array( $this, $file, &$row, &$rowClass ) );
- $classAttr = $rowClass ? " class='$rowClass'" : '';
-
- return "<tr{$classAttr}>{$row}</tr>\n";
- }
-
- /**
- * @param File $file
- * @return string
- */
- protected function getThumbForLine( $file ) {
- $lang = $this->getLanguage();
- $user = $this->getUser();
- if ( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE, $user )
- && !$file->isDeleted( File::DELETED_FILE )
- ) {
- $params = array(
- 'width' => '120',
- 'height' => '120',
- );
- $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() );
-
- $thumbnail = $file->transform( $params );
- $options = array(
- 'alt' => $this->msg( 'filehist-thumbtext',
- $lang->userTimeAndDate( $timestamp, $user ),
- $lang->userDate( $timestamp, $user ),
- $lang->userTime( $timestamp, $user ) )->text(),
- 'file-link' => true,
- );
-
- if ( !$thumbnail ) {
- return $this->msg( 'filehist-nothumb' )->escaped();
- }
-
- return $thumbnail->toHtml( $options );
- } else {
- return $this->msg( 'filehist-nothumb' )->escaped();
- }
- }
-
- /**
- * @param bool $enable
- */
- protected function preventClickjacking( $enable = true ) {
- $this->preventClickjacking = $enable;
- }
-
- /**
- * @return bool
- */
- public function getPreventClickjacking() {
- return $this->preventClickjacking;
- }
-}
-
-class ImageHistoryPseudoPager extends ReverseChronologicalPager {
- protected $preventClickjacking = false;
-
- /**
- * @var File
- */
- protected $mImg;
-
- /**
- * @var Title
- */
- protected $mTitle;
-
- /**
- * @param ImagePage $imagePage
- */
- function __construct( $imagePage ) {
- parent::__construct( $imagePage->getContext() );
- $this->mImagePage = $imagePage;
- $this->mTitle = clone ( $imagePage->getTitle() );
- $this->mTitle->setFragment( '#filehistory' );
- $this->mImg = null;
- $this->mHist = array();
- $this->mRange = array( 0, 0 ); // display range
- }
-
- /**
- * @return Title
- */
- function getTitle() {
- return $this->mTitle;
- }
-
- function getQueryInfo() {
- return false;
- }
-
- /**
- * @return string
- */
- function getIndexField() {
- return '';
- }
-
- /**
- * @param object $row
- * @return string
- */
- function formatRow( $row ) {
- return '';
- }
-
- /**
- * @return string
- */
- function getBody() {
- $s = '';
- $this->doQuery();
- if ( count( $this->mHist ) ) {
- $list = new ImageHistoryList( $this->mImagePage );
- # Generate prev/next links
- $navLink = $this->getNavigationBar();
- $s = $list->beginImageHistoryList( $navLink );
- // Skip rows there just for paging links
- for ( $i = $this->mRange[0]; $i <= $this->mRange[1]; $i++ ) {
- $file = $this->mHist[$i];
- $s .= $list->imageHistoryLine( !$file->isOld(), $file );
- }
- $s .= $list->endImageHistoryList( $navLink );
-
- if ( $list->getPreventClickjacking() ) {
- $this->preventClickjacking();
- }
- }
- return $s;
- }
-
- function doQuery() {
- if ( $this->mQueryDone ) {
- return;
- }
- $this->mImg = $this->mImagePage->getFile(); // ensure loading
- if ( !$this->mImg->exists() ) {
- return;
- }
- $queryLimit = $this->mLimit + 1; // limit plus extra row
- if ( $this->mIsBackwards ) {
- // Fetch the file history
- $this->mHist = $this->mImg->getHistory( $queryLimit, null, $this->mOffset, false );
- // The current rev may not meet the offset/limit
- $numRows = count( $this->mHist );
- if ( $numRows <= $this->mLimit && $this->mImg->getTimestamp() > $this->mOffset ) {
- $this->mHist = array_merge( array( $this->mImg ), $this->mHist );
- }
- } else {
- // The current rev may not meet the offset
- if ( !$this->mOffset || $this->mImg->getTimestamp() < $this->mOffset ) {
- $this->mHist[] = $this->mImg;
- }
- // Old image versions (fetch extra row for nav links)
- $oiLimit = count( $this->mHist ) ? $this->mLimit : $this->mLimit + 1;
- // Fetch the file history
- $this->mHist = array_merge( $this->mHist,
- $this->mImg->getHistory( $oiLimit, $this->mOffset, null, false ) );
- }
- $numRows = count( $this->mHist ); // Total number of query results
- if ( $numRows ) {
- # Index value of top item in the list
- $firstIndex = $this->mIsBackwards ?
- $this->mHist[$numRows - 1]->getTimestamp() : $this->mHist[0]->getTimestamp();
- # Discard the extra result row if there is one
- if ( $numRows > $this->mLimit && $numRows > 1 ) {
- if ( $this->mIsBackwards ) {
- # Index value of item past the index
- $this->mPastTheEndIndex = $this->mHist[0]->getTimestamp();
- # Index value of bottom item in the list
- $lastIndex = $this->mHist[1]->getTimestamp();
- # Display range
- $this->mRange = array( 1, $numRows - 1 );
- } else {
- # Index value of item past the index
- $this->mPastTheEndIndex = $this->mHist[$numRows - 1]->getTimestamp();
- # Index value of bottom item in the list
- $lastIndex = $this->mHist[$numRows - 2]->getTimestamp();
- # Display range
- $this->mRange = array( 0, $numRows - 2 );
- }
- } else {
- # Setting indexes to an empty string means that they will be
- # omitted if they would otherwise appear in URLs. It just so
- # happens that this is the right thing to do in the standard
- # UI, in all the relevant cases.
- $this->mPastTheEndIndex = '';
- # Index value of bottom item in the list
- $lastIndex = $this->mIsBackwards ?
- $this->mHist[0]->getTimestamp() : $this->mHist[$numRows - 1]->getTimestamp();
- # Display range
- $this->mRange = array( 0, $numRows - 1 );
- }
- } else {
- $firstIndex = '';
- $lastIndex = '';
- $this->mPastTheEndIndex = '';
- }
- if ( $this->mIsBackwards ) {
- $this->mIsFirst = ( $numRows < $queryLimit );
- $this->mIsLast = ( $this->mOffset == '' );
- $this->mLastShown = $firstIndex;
- $this->mFirstShown = $lastIndex;
- } else {
- $this->mIsFirst = ( $this->mOffset == '' );
- $this->mIsLast = ( $numRows < $queryLimit );
- $this->mLastShown = $lastIndex;
- $this->mFirstShown = $firstIndex;
- }
- $this->mQueryDone = true;
- }
-
- /**
- * @param bool $enable
- */
- protected function preventClickjacking( $enable = true ) {
- $this->preventClickjacking = $enable;
- }
-
- /**
- * @return bool
- */
- public function getPreventClickjacking() {
- return $this->preventClickjacking;
- }
-
-}
}
/**
- * Add a ParserOutput object, but without Html
+ * Add a ParserOutput object, but without Html.
*
+ * @deprecated since 1.24, use addParserOutputMetadata() instead.
* @param ParserOutput $parserOutput
*/
public function addParserOutputNoText( &$parserOutput ) {
+ wfDeprecated( __METHOD__, '1.24' );
+ $this->addParserOutputMetadata( $parserOutput );
+ }
+
+ /**
+ * Add all metadata associated with a ParserOutput object, but without the actual HTML. This
+ * includes categories, language links, ResourceLoader modules, effects of certain magic words,
+ * and so on.
+ *
+ * @since 1.24
+ * @param ParserOutput $parserOutput
+ */
+ public function addParserOutputMetadata( &$parserOutput ) {
$this->mLanguageLinks += $parserOutput->getLanguageLinks();
$this->addCategoryLinks( $parserOutput->getCategories() );
$this->mNewSectionLink = $parserOutput->getNewSection();
}
/**
- * Add a ParserOutput object
+ * Add the HTML and enhancements for it (like ResourceLoader modules) associated with a
+ * ParserOutput object, without any other metadata.
+ *
+ * @since 1.24
+ * @param ParserOutput $parserOutput
+ */
+ public function addParserOutputContent( &$parserOutput ) {
+ $this->addParserOutputText( $parserOutput );
+
+ $this->addModules( $parserOutput->getModules() );
+ $this->addModuleScripts( $parserOutput->getModuleScripts() );
+ $this->addModuleStyles( $parserOutput->getModuleStyles() );
+ $this->addModuleMessages( $parserOutput->getModuleMessages() );
+
+ $this->addJsConfigVars( $parserOutput->getJsConfigVars() );
+ }
+
+ /**
+ * Add the HTML associated with a ParserOutput object, without any metadata.
+ *
+ * @since 1.24
+ * @param ParserOutput $parserOutput
+ */
+ public function addParserOutputText( &$parserOutput ) {
+ $text = $parserOutput->getText();
+ wfRunHooks( 'OutputPageBeforeHTML', array( &$this, &$text ) );
+ $this->addHTML( $text );
+ }
+
+ /**
+ * Add everything from a ParserOutput object.
*
* @param ParserOutput $parserOutput
*/
function addParserOutput( &$parserOutput ) {
- $this->addParserOutputNoText( $parserOutput );
+ $this->addParserOutputMetadata( $parserOutput );
$parserOutput->setTOCEnabled( $this->mEnableTOC );
// Touch section edit links only if not previously disabled
if ( $parserOutput->getEditSectionTokens() ) {
$parserOutput->setEditSectionTokens( $this->mEnableSectionEditLinks );
}
- $text = $parserOutput->getText();
- wfRunHooks( 'OutputPageBeforeHTML', array( &$this, &$text ) );
- $this->addHTML( $text );
+
+ $this->addParserOutputText( $parserOutput );
}
/**
*/
public function search( $search, $limit, $namespaces = array() ) {
$search = trim( $search );
- if ( $search == '' ) {
- return array(); // Return empty result
+ if ( $search === '' ) {
+ return array();
}
+
$namespaces = $this->validateNamespaces( $namespaces );
- // Find a Title which is not an interwiki and is in NS_MAIN
- $title = Title::newFromText( $search );
- if ( $title && !$title->isExternal() ) {
- $ns = array( $title->getNamespace() );
- if ( $ns[0] == NS_MAIN ) {
- $ns = $namespaces; // no explicit prefix, use default namespaces
- }
- return $this->searchBackend(
- $ns, $title->getText(), $limit );
+ // Is this a namespace prefix? Start listing all pages in it.
+ $title = Title::newFromText( $search . 'Dummy' );
+ if ( $title
+ && $title->getText() === 'Dummy'
+ && !$title->inNamespace( NS_MAIN )
+ && !$title->isExternal()
+ ) {
+ $this->searchBackend( array( $title->getNamespace() ), '', $limit );
}
- // Is this a namespace prefix?
- $title = Title::newFromText( $search . 'Dummy' );
- if ( $title && $title->getText() == 'Dummy'
- && $title->getNamespace() != NS_MAIN
- && !$title->isExternal() )
- {
- $namespaces = array( $title->getNamespace() );
- $search = '';
+ // Explicit namespace prefix? Limit search to that namespace.
+ $title = Title::newFromText( $search );
+ if ( $title
+ && !$title->isExternal()
+ && !$title->inNamespace( NS_MAIN )
+ ) {
+ // This will convert first letter to uppercase if appropriate for the namespace
+ $this->searchBackend( array( $title->getNamespace() ), $title->getText(), $limit );
}
+ // Search in all requested namespaces
return $this->searchBackend( $namespaces, $search, $limit );
}
* @return array Array of Title objects
*/
protected function defaultSearchBackend( $namespaces, $search, $limit ) {
- $ns = array_shift( $namespaces ); // support only one namespace
- if ( in_array( NS_MAIN, $namespaces ) ) {
- $ns = NS_MAIN; // if searching on many always default to main
+ $dbr = wfGetDB( DB_SLAVE );
+
+ // Construct suitable prefix for each namespace, they might differ
+ $prefixes = array();
+ foreach ( $namespaces as $ns ) {
+ $title = Title::makeTitleSafe( $ns, $search );
+ $prefix = $title ? $title->getDBkey() : '';
+ $prefixes[$prefix][] = $ns;
+ }
+
+ $conds = array();
+ foreach ( $prefixes as $prefix => $nss ) {
+ $conds[] = $dbr->makeList( array(
+ 'page_namespace' => $nss,
+ 'page_title' . $dbr->buildLike( $prefix, $dbr->anyString() ),
+ ), LIST_AND );
}
- $t = Title::newFromText( $search, $ns );
- $prefix = $t ? $t->getDBkey() : '';
- $dbr = wfGetDB( DB_SLAVE );
$res = $dbr->select( 'page',
array( 'page_id', 'page_namespace', 'page_title' ),
- array(
- 'page_namespace' => $ns,
- 'page_title ' . $dbr->buildLike( $prefix, $dbr->anyString() )
- ),
+ $dbr->makeList( $conds, LIST_OR ),
__METHOD__,
array( 'LIMIT' => $limit, 'ORDER BY' => 'page_title' )
);
- $srchres = array();
- foreach ( $res as $row ) {
- $srchres[] = Title::newFromRow( $row );
- }
- return $srchres;
+
+ // Shorter than a loop, and doesn't break class api
+ return iterator_to_array( TitleArray::newFromResult( $res ) );
}
/**
// This is hacky and bad, but it will go away before 1.24 release (or so I hope).
// These lines should eventually be placed in skins' meta definition files, and loaded by a
// require_once for each skin file generated by the installer and placed in LocalSettings.php.
-$wgValidSkinNames['monobook'] = 'MonoBook';
-$wgValidSkinNames['vector'] = 'Vector';
+require_once "$wgStyleDirectory/MonoBook/MonoBook.php";
+require_once "$wgStyleDirectory/Vector/Vector.php";
wfProfileOut( $fname . '-globals' );
wfProfileIn( $fname . '-extensions' );
protected $mRelevantTitle = null;
protected $mRelevantUser = null;
+ /**
+ * @var string Stylesheets set to use. Subdirectory in skins/ where various stylesheets are
+ * located. Only needs to be set if you intend to use the getSkinStylePath() method.
+ */
+ public $stylename = null;
+
/**
* Fetch the set of available skins.
* @return array Associative array of strings
static function getSkinNameMessages() {
$messages = array();
foreach ( self::getSkinNames() as $skinKey => $skinName ) {
- // Messages: skinname-vector, skinname-monobook
$messages[] = "skinname-$skinKey";
}
return $messages;
* Return a fully resolved style path url to images or styles stored in the current skins's folder.
* This method returns a url resolved using the configured skin style path
* and includes the style version inside of the url.
+ *
+ * Requires $stylename to be set, otherwise throws MWException.
+ *
* @param string $name The name or path of a skin resource file
* @return string The fully resolved style path url including styleversion
*/
function getSkinStylePath( $name ) {
global $wgStylePath, $wgStyleVersion;
+
+ if ( $this->stylename === null ) {
+ $class = get_class( $this );
+ throw new MWException( "$class::\$stylename must be set to use getSkinStylePath()" );
+ }
+
return "$wgStylePath/{$this->stylename}/$name?$wgStyleVersion";
}
*/
public $skinname = 'monobook';
- /**
- * @var string Stylesheets set to use. Subdirectory in skins/ where various
- * stylesheets are located. Child classes should override the default.
- */
- public $stylename = 'monobook';
-
/**
* @var string For QuickTemplate, the name of the subclass which will
* actually fill the template. Child classes should override the default.
$ilLangName = Language::fetchLanguageName( $ilInterwikiCode );
if ( strval( $ilLangName ) === '' ) {
- $ilLangName = $languageLinkText;
+ $ilDisplayTextMsg = wfMessage( "interlanguage-link-$ilInterwikiCode" );
+ if ( !$ilDisplayTextMsg->isDisabled() ) {
+ // Use custom MW message for the display text
+ $ilLangName = $ilDisplayTextMsg->text();
+ } else {
+ // Last resort: fallback to the language link target
+ $ilLangName = $languageLinkText;
+ }
} else {
+ // Use the language autonym as display text
$ilLangName = $this->formatLanguageName( $ilLangName );
}
);
$languageLinkTitleText = $languageLinkTitle->getText();
- if ( $languageLinkTitleText === '' ) {
+ if ( $ilLangLocalName === '' ) {
+ $ilFriendlySiteName = wfMessage( "interlanguage-link-sitename-$ilInterwikiCode" );
+ if ( !$ilFriendlySiteName->isDisabled() ) {
+ if ( $languageLinkTitleText === '' ) {
+ $ilTitle = wfMessage(
+ 'interlanguage-link-title-nonlangonly',
+ $ilFriendlySiteName->text()
+ )->text();
+ } else {
+ $ilTitle = wfMessage(
+ 'interlanguage-link-title-nonlang',
+ $languageLinkTitleText,
+ $ilFriendlySiteName->text()
+ )->text();
+ }
+ } else {
+ // we have nothing friendly to put in the title, so fall back to
+ // displaying the interlanguage link itself in the title text
+ // (similar to what is done in page content)
+ $ilTitle = $languageLinkTitle->getInterwiki() .
+ ":$languageLinkTitleText";
+ }
+ } elseif ( $languageLinkTitleText === '' ) {
$ilTitle = wfMessage(
'interlanguage-link-title-langonly',
$ilLangLocalName
return $this->appendQueryArray( wfCgiToArray( $query ) );
}
- /**
- * HTML-safe version of appendQuery().
- * @deprecated: Deprecated in 1.20, warnings in 1.21, remove in 1.22.
- *
- * @param string $query Query string fragment; do not include initial '?'
- * @return string
- */
- public function escapeAppendQuery( $query ) {
- return htmlspecialchars( $this->appendQuery( $query ) );
- }
-
/**
* @param string $key
* @param string $value
+++ /dev/null
-<?php
-/**
- * Special handling for category pages.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Special handling for category pages
- */
-class WikiCategoryPage extends WikiPage {
-
- /**
- * Don't return a 404 for categories in use.
- * In use defined as: either the actual page exists
- * or the category currently has members.
- *
- * @return bool
- */
- public function hasViewableContent() {
- if ( parent::hasViewableContent() ) {
- return true;
- } else {
- $cat = Category::newFromTitle( $this->mTitle );
- // If any of these are not 0, then has members
- if ( $cat->getPageCount()
- || $cat->getSubcatCount()
- || $cat->getFileCount()
- ) {
- return true;
- }
- }
- return false;
- }
-}
+++ /dev/null
-<?php
-/**
- * Special handling for file pages.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Special handling for file pages
- *
- * @ingroup Media
- */
-class WikiFilePage extends WikiPage {
- /**
- * @var File
- */
- protected $mFile = false; // !< File object
- protected $mRepo = null; // !<
- protected $mFileLoaded = false; // !<
- protected $mDupes = null; // !<
-
- public function __construct( $title ) {
- parent::__construct( $title );
- $this->mDupes = null;
- $this->mRepo = null;
- }
-
- public function getActionOverrides() {
- $overrides = parent::getActionOverrides();
- $overrides['revert'] = 'RevertFileAction';
- return $overrides;
- }
-
- /**
- * @param File $file
- */
- public function setFile( $file ) {
- $this->mFile = $file;
- $this->mFileLoaded = true;
- }
-
- /**
- * @return bool
- */
- protected function loadFile() {
- if ( $this->mFileLoaded ) {
- return true;
- }
- $this->mFileLoaded = true;
-
- $this->mFile = wfFindFile( $this->mTitle );
- if ( !$this->mFile ) {
- $this->mFile = wfLocalFile( $this->mTitle ); // always a File
- }
- $this->mRepo = $this->mFile->getRepo();
- return true;
- }
-
- /**
- * @return mixed|null|Title
- */
- public function getRedirectTarget() {
- $this->loadFile();
- if ( $this->mFile->isLocal() ) {
- return parent::getRedirectTarget();
- }
- // Foreign image page
- $from = $this->mFile->getRedirected();
- $to = $this->mFile->getName();
- if ( $from == $to ) {
- return null;
- }
- $this->mRedirectTarget = Title::makeTitle( NS_FILE, $to );
- return $this->mRedirectTarget;
- }
-
- /**
- * @return bool|mixed|Title
- */
- public function followRedirect() {
- $this->loadFile();
- if ( $this->mFile->isLocal() ) {
- return parent::followRedirect();
- }
- $from = $this->mFile->getRedirected();
- $to = $this->mFile->getName();
- if ( $from == $to ) {
- return false;
- }
- return Title::makeTitle( NS_FILE, $to );
- }
-
- /**
- * @return bool
- */
- public function isRedirect() {
- $this->loadFile();
- if ( $this->mFile->isLocal() ) {
- return parent::isRedirect();
- }
-
- return (bool)$this->mFile->getRedirected();
- }
-
- /**
- * @return bool
- */
- public function isLocal() {
- $this->loadFile();
- return $this->mFile->isLocal();
- }
-
- /**
- * @return bool|File
- */
- public function getFile() {
- $this->loadFile();
- return $this->mFile;
- }
-
- /**
- * @return array|null
- */
- public function getDuplicates() {
- $this->loadFile();
- if ( !is_null( $this->mDupes ) ) {
- return $this->mDupes;
- }
- $hash = $this->mFile->getSha1();
- if ( !( $hash ) ) {
- $this->mDupes = array();
- return $this->mDupes;
- }
- $dupes = RepoGroup::singleton()->findBySha1( $hash );
- // Remove duplicates with self and non matching file sizes
- $self = $this->mFile->getRepoName() . ':' . $this->mFile->getName();
- $size = $this->mFile->getSize();
-
- /**
- * @var $file File
- */
- foreach ( $dupes as $index => $file ) {
- $key = $file->getRepoName() . ':' . $file->getName();
- if ( $key == $self ) {
- unset( $dupes[$index] );
- }
- if ( $file->getSize() != $size ) {
- unset( $dupes[$index] );
- }
- }
- $this->mDupes = $dupes;
- return $this->mDupes;
- }
-
- /**
- * Override handling of action=purge
- * @return bool
- */
- public function doPurge() {
- $this->loadFile();
- if ( $this->mFile->exists() ) {
- wfDebug( 'ImagePage::doPurge purging ' . $this->mFile->getName() . "\n" );
- $update = new HTMLCacheUpdate( $this->mTitle, 'imagelinks' );
- $update->doUpdate();
- $this->mFile->upgradeRow();
- $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
- } else {
- wfDebug( 'ImagePage::doPurge no image for '
- . $this->mFile->getName() . "; limiting purge to cache only\n" );
- // even if the file supposedly doesn't exist, force any cached information
- // to be updated (in case the cached information is wrong)
- $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
- }
- if ( $this->mRepo ) {
- // Purge redirect cache
- $this->mRepo->invalidateImageRedirect( $this->mTitle );
- }
- return parent::doPurge();
- }
-
- /**
- * Get the categories this file is a member of on the wiki where it was uploaded.
- * For local files, this is the same as getCategories().
- * For foreign API files (InstantCommons), this is not supported currently.
- * Results will include hidden categories.
- *
- * @return TitleArray|Title[]
- * @since 1.23
- */
- public function getForeignCategories() {
- $this->loadFile();
- $title = $this->mTitle;
- $file = $this->mFile;
-
- if ( ! $file instanceof LocalFile ) {
- wfDebug( __CLASS__ . '::' . __METHOD__ . " is not supported for this file\n" );
- return TitleArray::newFromResult( new FakeResultWrapper( array() ) );
- }
-
- /** @var LocalRepo $repo */
- $repo = $file->getRepo();
- $dbr = $repo->getSlaveDB();
-
- $res = $dbr->select(
- array( 'page', 'categorylinks' ),
- array(
- 'page_title' => 'cl_to',
- 'page_namespace' => NS_CATEGORY,
- ),
- array(
- 'page_namespace' => $title->getNamespace(),
- 'page_title' => $title->getDBkey(),
- ),
- __METHOD__,
- array(),
- array( 'categorylinks' => array( 'INNER JOIN', 'page_id = cl_from' ) )
- );
-
- return TitleArray::newFromResult( $res );
- }
-}
+++ /dev/null
-<?php
-/**
- * Base representation for a MediaWiki page.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Abstract class for type hinting (accepts WikiPage, Article, ImagePage, CategoryPage)
- */
-interface Page {
-}
-
-/**
- * Class representing a MediaWiki article and history.
- *
- * Some fields are public only for backwards-compatibility. Use accessors.
- * In the past, this class was part of Article.php and everything was public.
- *
- * @internal documentation reviewed 15 Mar 2010
- */
-class WikiPage implements Page, IDBAccessObject {
- // Constants for $mDataLoadedFrom and related
-
- /**
- * @var Title
- */
- public $mTitle = null;
-
- /**@{{
- * @protected
- */
- public $mDataLoaded = false; // !< Boolean
- public $mIsRedirect = false; // !< Boolean
- public $mLatest = false; // !< Integer (false means "not loaded")
- /**@}}*/
-
- /** @var stdclass Map of cache fields (text, parser output, ect) for a proposed/new edit */
- public $mPreparedEdit = false;
-
- /**
- * @var int
- */
- protected $mId = null;
-
- /**
- * @var int One of the READ_* constants
- */
- protected $mDataLoadedFrom = self::READ_NONE;
-
- /**
- * @var Title
- */
- protected $mRedirectTarget = null;
-
- /**
- * @var Revision
- */
- protected $mLastRevision = null;
-
- /**
- * @var string Timestamp of the current revision or empty string if not loaded
- */
- protected $mTimestamp = '';
-
- /**
- * @var string
- */
- protected $mTouched = '19700101000000';
-
- /**
- * @var string
- */
- protected $mLinksUpdated = '19700101000000';
-
- /**
- * @var int|null
- */
- protected $mCounter = null;
-
- /**
- * Constructor and clear the article
- * @param Title $title Reference to a Title object.
- */
- public function __construct( Title $title ) {
- $this->mTitle = $title;
- }
-
- /**
- * Create a WikiPage object of the appropriate class for the given title.
- *
- * @param Title $title
- *
- * @throws MWException
- * @return WikiPage Object of the appropriate type
- */
- public static function factory( Title $title ) {
- $ns = $title->getNamespace();
-
- if ( $ns == NS_MEDIA ) {
- throw new MWException( "NS_MEDIA is a virtual namespace; use NS_FILE." );
- } elseif ( $ns < 0 ) {
- throw new MWException( "Invalid or virtual namespace $ns given." );
- }
-
- switch ( $ns ) {
- case NS_FILE:
- $page = new WikiFilePage( $title );
- break;
- case NS_CATEGORY:
- $page = new WikiCategoryPage( $title );
- break;
- default:
- $page = new WikiPage( $title );
- }
-
- return $page;
- }
-
- /**
- * Constructor from a page id
- *
- * @param int $id Article ID to load
- * @param string|int $from One of the following values:
- * - "fromdb" or WikiPage::READ_NORMAL to select from a slave database
- * - "fromdbmaster" or WikiPage::READ_LATEST to select from the master database
- *
- * @return WikiPage|null
- */
- public static function newFromID( $id, $from = 'fromdb' ) {
- // page id's are never 0 or negative, see bug 61166
- if ( $id < 1 ) {
- return null;
- }
-
- $from = self::convertSelectType( $from );
- $db = wfGetDB( $from === self::READ_LATEST ? DB_MASTER : DB_SLAVE );
- $row = $db->selectRow( 'page', self::selectFields(), array( 'page_id' => $id ), __METHOD__ );
- if ( !$row ) {
- return null;
- }
- return self::newFromRow( $row, $from );
- }
-
- /**
- * Constructor from a database row
- *
- * @since 1.20
- * @param object $row Database row containing at least fields returned by selectFields().
- * @param string|int $from Source of $data:
- * - "fromdb" or WikiPage::READ_NORMAL: from a slave DB
- * - "fromdbmaster" or WikiPage::READ_LATEST: from the master DB
- * - "forupdate" or WikiPage::READ_LOCKING: from the master DB using SELECT FOR UPDATE
- * @return WikiPage
- */
- public static function newFromRow( $row, $from = 'fromdb' ) {
- $page = self::factory( Title::newFromRow( $row ) );
- $page->loadFromRow( $row, $from );
- return $page;
- }
-
- /**
- * Convert 'fromdb', 'fromdbmaster' and 'forupdate' to READ_* constants.
- *
- * @param object|string|int $type
- * @return mixed
- */
- private static function convertSelectType( $type ) {
- switch ( $type ) {
- case 'fromdb':
- return self::READ_NORMAL;
- case 'fromdbmaster':
- return self::READ_LATEST;
- case 'forupdate':
- return self::READ_LOCKING;
- default:
- // It may already be an integer or whatever else
- return $type;
- }
- }
-
- /**
- * Returns overrides for action handlers.
- * Classes listed here will be used instead of the default one when
- * (and only when) $wgActions[$action] === true. This allows subclasses
- * to override the default behavior.
- *
- * @todo Move this UI stuff somewhere else
- *
- * @return array
- */
- public function getActionOverrides() {
- $content_handler = $this->getContentHandler();
- return $content_handler->getActionOverrides();
- }
-
- /**
- * Returns the ContentHandler instance to be used to deal with the content of this WikiPage.
- *
- * Shorthand for ContentHandler::getForModelID( $this->getContentModel() );
- *
- * @return ContentHandler
- *
- * @since 1.21
- */
- public function getContentHandler() {
- return ContentHandler::getForModelID( $this->getContentModel() );
- }
-
- /**
- * Get the title object of the article
- * @return Title Title object of this page
- */
- public function getTitle() {
- return $this->mTitle;
- }
-
- /**
- * Clear the object
- * @return void
- */
- public function clear() {
- $this->mDataLoaded = false;
- $this->mDataLoadedFrom = self::READ_NONE;
-
- $this->clearCacheFields();
- }
-
- /**
- * Clear the object cache fields
- * @return void
- */
- protected function clearCacheFields() {
- $this->mId = null;
- $this->mCounter = null;
- $this->mRedirectTarget = null; // Title object if set
- $this->mLastRevision = null; // Latest revision
- $this->mTouched = '19700101000000';
- $this->mLinksUpdated = '19700101000000';
- $this->mTimestamp = '';
- $this->mIsRedirect = false;
- $this->mLatest = false;
- // Bug 57026: do not clear mPreparedEdit since prepareTextForEdit() already checks
- // the requested rev ID and content against the cached one for equality. For most
- // content types, the output should not change during the lifetime of this cache.
- // Clearing it can cause extra parses on edit for no reason.
- }
-
- /**
- * Clear the mPreparedEdit cache field, as may be needed by mutable content types
- * @return void
- * @since 1.23
- */
- public function clearPreparedEdit() {
- $this->mPreparedEdit = false;
- }
-
- /**
- * Return the list of revision fields that should be selected to create
- * a new page.
- *
- * @return array
- */
- public static function selectFields() {
- global $wgContentHandlerUseDB;
-
- $fields = array(
- 'page_id',
- 'page_namespace',
- 'page_title',
- 'page_restrictions',
- 'page_counter',
- 'page_is_redirect',
- 'page_is_new',
- 'page_random',
- 'page_touched',
- 'page_links_updated',
- 'page_latest',
- 'page_len',
- );
-
- if ( $wgContentHandlerUseDB ) {
- $fields[] = 'page_content_model';
- }
-
- return $fields;
- }
-
- /**
- * Fetch a page record with the given conditions
- * @param DatabaseBase $dbr
- * @param array $conditions
- * @param array $options
- * @return object|bool Database result resource, or false on failure
- */
- protected function pageData( $dbr, $conditions, $options = array() ) {
- $fields = self::selectFields();
-
- wfRunHooks( 'ArticlePageDataBefore', array( &$this, &$fields ) );
-
- $row = $dbr->selectRow( 'page', $fields, $conditions, __METHOD__, $options );
-
- wfRunHooks( 'ArticlePageDataAfter', array( &$this, &$row ) );
-
- return $row;
- }
-
- /**
- * Fetch a page record matching the Title object's namespace and title
- * using a sanitized title string
- *
- * @param DatabaseBase $dbr
- * @param Title $title
- * @param array $options
- * @return object|bool Database result resource, or false on failure
- */
- public function pageDataFromTitle( $dbr, $title, $options = array() ) {
- return $this->pageData( $dbr, array(
- 'page_namespace' => $title->getNamespace(),
- 'page_title' => $title->getDBkey() ), $options );
- }
-
- /**
- * Fetch a page record matching the requested ID
- *
- * @param DatabaseBase $dbr
- * @param int $id
- * @param array $options
- * @return object|bool Database result resource, or false on failure
- */
- public function pageDataFromId( $dbr, $id, $options = array() ) {
- return $this->pageData( $dbr, array( 'page_id' => $id ), $options );
- }
-
- /**
- * Set the general counter, title etc data loaded from
- * some source.
- *
- * @param object|string|int $from One of the following:
- * - A DB query result object.
- * - "fromdb" or WikiPage::READ_NORMAL to get from a slave DB.
- * - "fromdbmaster" or WikiPage::READ_LATEST to get from the master DB.
- * - "forupdate" or WikiPage::READ_LOCKING to get from the master DB
- * using SELECT FOR UPDATE.
- *
- * @return void
- */
- public function loadPageData( $from = 'fromdb' ) {
- $from = self::convertSelectType( $from );
- if ( is_int( $from ) && $from <= $this->mDataLoadedFrom ) {
- // We already have the data from the correct location, no need to load it twice.
- return;
- }
-
- if ( $from === self::READ_LOCKING ) {
- $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle, array( 'FOR UPDATE' ) );
- } elseif ( $from === self::READ_LATEST ) {
- $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
- } elseif ( $from === self::READ_NORMAL ) {
- $data = $this->pageDataFromTitle( wfGetDB( DB_SLAVE ), $this->mTitle );
- // Use a "last rev inserted" timestamp key to diminish the issue of slave lag.
- // Note that DB also stores the master position in the session and checks it.
- $touched = $this->getCachedLastEditTime();
- if ( $touched ) { // key set
- if ( !$data || $touched > wfTimestamp( TS_MW, $data->page_touched ) ) {
- $from = self::READ_LATEST;
- $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
- }
- }
- } else {
- // No idea from where the caller got this data, assume slave database.
- $data = $from;
- $from = self::READ_NORMAL;
- }
-
- $this->loadFromRow( $data, $from );
- }
-
- /**
- * Load the object from a database row
- *
- * @since 1.20
- * @param object $data Database row containing at least fields returned by selectFields()
- * @param string|int $from One of the following:
- * - "fromdb" or WikiPage::READ_NORMAL if the data comes from a slave DB
- * - "fromdbmaster" or WikiPage::READ_LATEST if the data comes from the master DB
- * - "forupdate" or WikiPage::READ_LOCKING if the data comes from from
- * the master DB using SELECT FOR UPDATE
- */
- public function loadFromRow( $data, $from ) {
- $lc = LinkCache::singleton();
- $lc->clearLink( $this->mTitle );
-
- if ( $data ) {
- $lc->addGoodLinkObjFromRow( $this->mTitle, $data );
-
- $this->mTitle->loadFromRow( $data );
-
- // Old-fashioned restrictions
- $this->mTitle->loadRestrictions( $data->page_restrictions );
-
- $this->mId = intval( $data->page_id );
- $this->mCounter = intval( $data->page_counter );
- $this->mTouched = wfTimestamp( TS_MW, $data->page_touched );
- $this->mLinksUpdated = wfTimestampOrNull( TS_MW, $data->page_links_updated );
- $this->mIsRedirect = intval( $data->page_is_redirect );
- $this->mLatest = intval( $data->page_latest );
- // Bug 37225: $latest may no longer match the cached latest Revision object.
- // Double-check the ID of any cached latest Revision object for consistency.
- if ( $this->mLastRevision && $this->mLastRevision->getId() != $this->mLatest ) {
- $this->mLastRevision = null;
- $this->mTimestamp = '';
- }
- } else {
- $lc->addBadLinkObj( $this->mTitle );
-
- $this->mTitle->loadFromRow( false );
-
- $this->clearCacheFields();
-
- $this->mId = 0;
- }
-
- $this->mDataLoaded = true;
- $this->mDataLoadedFrom = self::convertSelectType( $from );
- }
-
- /**
- * @return int Page ID
- */
- public function getId() {
- if ( !$this->mDataLoaded ) {
- $this->loadPageData();
- }
- return $this->mId;
- }
-
- /**
- * @return bool Whether or not the page exists in the database
- */
- public function exists() {
- if ( !$this->mDataLoaded ) {
- $this->loadPageData();
- }
- return $this->mId > 0;
- }
-
- /**
- * Check if this page is something we're going to be showing
- * some sort of sensible content for. If we return false, page
- * views (plain action=view) will return an HTTP 404 response,
- * so spiders and robots can know they're following a bad link.
- *
- * @return bool
- */
- public function hasViewableContent() {
- return $this->exists() || $this->mTitle->isAlwaysKnown();
- }
-
- /**
- * @return int The view count for the page
- */
- public function getCount() {
- if ( !$this->mDataLoaded ) {
- $this->loadPageData();
- }
-
- return $this->mCounter;
- }
-
- /**
- * Tests if the article content represents a redirect
- *
- * @return bool
- */
- public function isRedirect() {
- $content = $this->getContent();
- if ( !$content ) {
- return false;
- }
-
- return $content->isRedirect();
- }
-
- /**
- * Returns the page's content model id (see the CONTENT_MODEL_XXX constants).
- *
- * Will use the revisions actual content model if the page exists,
- * and the page's default if the page doesn't exist yet.
- *
- * @return string
- *
- * @since 1.21
- */
- public function getContentModel() {
- if ( $this->exists() ) {
- // look at the revision's actual content model
- $rev = $this->getRevision();
-
- if ( $rev !== null ) {
- return $rev->getContentModel();
- } else {
- $title = $this->mTitle->getPrefixedDBkey();
- wfWarn( "Page $title exists but has no (visible) revisions!" );
- }
- }
-
- // use the default model for this page
- return $this->mTitle->getContentModel();
- }
-
- /**
- * Loads page_touched and returns a value indicating if it should be used
- * @return bool true if not a redirect
- */
- public function checkTouched() {
- if ( !$this->mDataLoaded ) {
- $this->loadPageData();
- }
- return !$this->mIsRedirect;
- }
-
- /**
- * Get the page_touched field
- * @return string Containing GMT timestamp
- */
- public function getTouched() {
- if ( !$this->mDataLoaded ) {
- $this->loadPageData();
- }
- return $this->mTouched;
- }
-
- /**
- * Get the page_links_updated field
- * @return string|null Containing GMT timestamp
- */
- public function getLinksTimestamp() {
- if ( !$this->mDataLoaded ) {
- $this->loadPageData();
- }
- return $this->mLinksUpdated;
- }
-
- /**
- * Get the page_latest field
- * @return int rev_id of current revision
- */
- public function getLatest() {
- if ( !$this->mDataLoaded ) {
- $this->loadPageData();
- }
- return (int)$this->mLatest;
- }
-
- /**
- * Get the Revision object of the oldest revision
- * @return Revision|null
- */
- public function getOldestRevision() {
- wfProfileIn( __METHOD__ );
-
- // Try using the slave database first, then try the master
- $continue = 2;
- $db = wfGetDB( DB_SLAVE );
- $revSelectFields = Revision::selectFields();
-
- $row = null;
- while ( $continue ) {
- $row = $db->selectRow(
- array( 'page', 'revision' ),
- $revSelectFields,
- array(
- 'page_namespace' => $this->mTitle->getNamespace(),
- 'page_title' => $this->mTitle->getDBkey(),
- 'rev_page = page_id'
- ),
- __METHOD__,
- array(
- 'ORDER BY' => 'rev_timestamp ASC'
- )
- );
-
- if ( $row ) {
- $continue = 0;
- } else {
- $db = wfGetDB( DB_MASTER );
- $continue--;
- }
- }
-
- wfProfileOut( __METHOD__ );
- return $row ? Revision::newFromRow( $row ) : null;
- }
-
- /**
- * Loads everything except the text
- * This isn't necessary for all uses, so it's only done if needed.
- */
- protected function loadLastEdit() {
- if ( $this->mLastRevision !== null ) {
- return; // already loaded
- }
-
- $latest = $this->getLatest();
- if ( !$latest ) {
- return; // page doesn't exist or is missing page_latest info
- }
-
- // Bug 37225: if session S1 loads the page row FOR UPDATE, the result always includes the
- // latest changes committed. This is true even within REPEATABLE-READ transactions, where
- // S1 normally only sees changes committed before the first S1 SELECT. Thus we need S1 to
- // also gets the revision row FOR UPDATE; otherwise, it may not find it since a page row
- // UPDATE and revision row INSERT by S2 may have happened after the first S1 SELECT.
- // http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read.
- $flags = ( $this->mDataLoadedFrom == self::READ_LOCKING ) ? Revision::READ_LOCKING : 0;
- $revision = Revision::newFromPageId( $this->getId(), $latest, $flags );
- if ( $revision ) { // sanity
- $this->setLastEdit( $revision );
- }
- }
-
- /**
- * Set the latest revision
- * @param Revision $revision
- */
- protected function setLastEdit( Revision $revision ) {
- $this->mLastRevision = $revision;
- $this->mTimestamp = $revision->getTimestamp();
- }
-
- /**
- * Get the latest revision
- * @return Revision|null
- */
- public function getRevision() {
- $this->loadLastEdit();
- if ( $this->mLastRevision ) {
- return $this->mLastRevision;
- }
- return null;
- }
-
- /**
- * Get the content of the current revision. No side-effects...
- *
- * @param int $audience int One of:
- * Revision::FOR_PUBLIC to be displayed to all users
- * Revision::FOR_THIS_USER to be displayed to $wgUser
- * Revision::RAW get the text regardless of permissions
- * @param User $user User object to check for, only if FOR_THIS_USER is passed
- * to the $audience parameter
- * @return Content|null The content of the current revision
- *
- * @since 1.21
- */
- public function getContent( $audience = Revision::FOR_PUBLIC, User $user = null ) {
- $this->loadLastEdit();
- if ( $this->mLastRevision ) {
- return $this->mLastRevision->getContent( $audience, $user );
- }
- return null;
- }
-
- /**
- * Get the text of the current revision. No side-effects...
- *
- * @param int $audience One of:
- * Revision::FOR_PUBLIC to be displayed to all users
- * Revision::FOR_THIS_USER to be displayed to the given user
- * Revision::RAW get the text regardless of permissions
- * @param User $user User object to check for, only if FOR_THIS_USER is passed
- * to the $audience parameter
- * @return string|bool The text of the current revision
- * @deprecated since 1.21, getContent() should be used instead.
- */
- public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
- ContentHandler::deprecated( __METHOD__, '1.21' );
-
- $this->loadLastEdit();
- if ( $this->mLastRevision ) {
- return $this->mLastRevision->getText( $audience, $user );
- }
- return false;
- }
-
- /**
- * Get the text of the current revision. No side-effects...
- *
- * @return string|bool The text of the current revision. False on failure
- * @deprecated since 1.21, getContent() should be used instead.
- */
- public function getRawText() {
- ContentHandler::deprecated( __METHOD__, '1.21' );
-
- return $this->getText( Revision::RAW );
- }
-
- /**
- * @return string MW timestamp of last article revision
- */
- public function getTimestamp() {
- // Check if the field has been filled by WikiPage::setTimestamp()
- if ( !$this->mTimestamp ) {
- $this->loadLastEdit();
- }
-
- return wfTimestamp( TS_MW, $this->mTimestamp );
- }
-
- /**
- * Set the page timestamp (use only to avoid DB queries)
- * @param string $ts MW timestamp of last article revision
- * @return void
- */
- public function setTimestamp( $ts ) {
- $this->mTimestamp = wfTimestamp( TS_MW, $ts );
- }
-
- /**
- * @param int $audience One of:
- * Revision::FOR_PUBLIC to be displayed to all users
- * Revision::FOR_THIS_USER to be displayed to the given user
- * Revision::RAW get the text regardless of permissions
- * @param User $user User object to check for, only if FOR_THIS_USER is passed
- * to the $audience parameter
- * @return int user ID for the user that made the last article revision
- */
- public function getUser( $audience = Revision::FOR_PUBLIC, User $user = null ) {
- $this->loadLastEdit();
- if ( $this->mLastRevision ) {
- return $this->mLastRevision->getUser( $audience, $user );
- } else {
- return -1;
- }
- }
-
- /**
- * Get the User object of the user who created the page
- * @param int $audience One of:
- * Revision::FOR_PUBLIC to be displayed to all users
- * Revision::FOR_THIS_USER to be displayed to the given user
- * Revision::RAW get the text regardless of permissions
- * @param User $user User object to check for, only if FOR_THIS_USER is passed
- * to the $audience parameter
- * @return User|null
- */
- public function getCreator( $audience = Revision::FOR_PUBLIC, User $user = null ) {
- $revision = $this->getOldestRevision();
- if ( $revision ) {
- $userName = $revision->getUserText( $audience, $user );
- return User::newFromName( $userName, false );
- } else {
- return null;
- }
- }
-
- /**
- * @param int $audience One of:
- * Revision::FOR_PUBLIC to be displayed to all users
- * Revision::FOR_THIS_USER to be displayed to the given user
- * Revision::RAW get the text regardless of permissions
- * @param User $user User object to check for, only if FOR_THIS_USER is passed
- * to the $audience parameter
- * @return string username of the user that made the last article revision
- */
- public function getUserText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
- $this->loadLastEdit();
- if ( $this->mLastRevision ) {
- return $this->mLastRevision->getUserText( $audience, $user );
- } else {
- return '';
- }
- }
-
- /**
- * @param int $audience One of:
- * Revision::FOR_PUBLIC to be displayed to all users
- * Revision::FOR_THIS_USER to be displayed to the given user
- * Revision::RAW get the text regardless of permissions
- * @param User $user User object to check for, only if FOR_THIS_USER is passed
- * to the $audience parameter
- * @return string Comment stored for the last article revision
- */
- public function getComment( $audience = Revision::FOR_PUBLIC, User $user = null ) {
- $this->loadLastEdit();
- if ( $this->mLastRevision ) {
- return $this->mLastRevision->getComment( $audience, $user );
- } else {
- return '';
- }
- }
-
- /**
- * Returns true if last revision was marked as "minor edit"
- *
- * @return bool Minor edit indicator for the last article revision.
- */
- public function getMinorEdit() {
- $this->loadLastEdit();
- if ( $this->mLastRevision ) {
- return $this->mLastRevision->isMinor();
- } else {
- return false;
- }
- }
-
- /**
- * Get the cached timestamp for the last time the page changed.
- * This is only used to help handle slave lag by comparing to page_touched.
- * @return string MW timestamp
- */
- protected function getCachedLastEditTime() {
- global $wgMemc;
- $key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
- return $wgMemc->get( $key );
- }
-
- /**
- * Set the cached timestamp for the last time the page changed.
- * This is only used to help handle slave lag by comparing to page_touched.
- * @param string $timestamp
- * @return void
- */
- public function setCachedLastEditTime( $timestamp ) {
- global $wgMemc;
- $key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
- $wgMemc->set( $key, wfTimestamp( TS_MW, $timestamp ), 60 * 15 );
- }
-
- /**
- * Determine whether a page would be suitable for being counted as an
- * article in the site_stats table based on the title & its content
- *
- * @param object|bool $editInfo (false): object returned by prepareTextForEdit(),
- * if false, the current database state will be used
- * @return bool
- */
- public function isCountable( $editInfo = false ) {
- global $wgArticleCountMethod;
-
- if ( !$this->mTitle->isContentPage() ) {
- return false;
- }
-
- if ( $editInfo ) {
- $content = $editInfo->pstContent;
- } else {
- $content = $this->getContent();
- }
-
- if ( !$content || $content->isRedirect() ) {
- return false;
- }
-
- $hasLinks = null;
-
- if ( $wgArticleCountMethod === 'link' ) {
- // nasty special case to avoid re-parsing to detect links
-
- if ( $editInfo ) {
- // ParserOutput::getLinks() is a 2D array of page links, so
- // to be really correct we would need to recurse in the array
- // but the main array should only have items in it if there are
- // links.
- $hasLinks = (bool)count( $editInfo->output->getLinks() );
- } else {
- $hasLinks = (bool)wfGetDB( DB_SLAVE )->selectField( 'pagelinks', 1,
- array( 'pl_from' => $this->getId() ), __METHOD__ );
- }
- }
-
- return $content->isCountable( $hasLinks );
- }
-
- /**
- * If this page is a redirect, get its target
- *
- * The target will be fetched from the redirect table if possible.
- * If this page doesn't have an entry there, call insertRedirect()
- * @return Title|null Title object, or null if this page is not a redirect
- */
- public function getRedirectTarget() {
- if ( !$this->mTitle->isRedirect() ) {
- return null;
- }
-
- if ( $this->mRedirectTarget !== null ) {
- return $this->mRedirectTarget;
- }
-
- // Query the redirect table
- $dbr = wfGetDB( DB_SLAVE );
- $row = $dbr->selectRow( 'redirect',
- array( 'rd_namespace', 'rd_title', 'rd_fragment', 'rd_interwiki' ),
- array( 'rd_from' => $this->getId() ),
- __METHOD__
- );
-
- // rd_fragment and rd_interwiki were added later, populate them if empty
- if ( $row && !is_null( $row->rd_fragment ) && !is_null( $row->rd_interwiki ) ) {
- $this->mRedirectTarget = Title::makeTitle(
- $row->rd_namespace, $row->rd_title,
- $row->rd_fragment, $row->rd_interwiki );
- return $this->mRedirectTarget;
- }
-
- // This page doesn't have an entry in the redirect table
- $this->mRedirectTarget = $this->insertRedirect();
- return $this->mRedirectTarget;
- }
-
- /**
- * Insert an entry for this page into the redirect table.
- *
- * Don't call this function directly unless you know what you're doing.
- * @return Title|null Title object or null if not a redirect
- */
- public function insertRedirect() {
- // recurse through to only get the final target
- $content = $this->getContent();
- $retval = $content ? $content->getUltimateRedirectTarget() : null;
- if ( !$retval ) {
- return null;
- }
- $this->insertRedirectEntry( $retval );
- return $retval;
- }
-
- /**
- * Insert or update the redirect table entry for this page to indicate
- * it redirects to $rt .
- * @param Title $rt Redirect target
- */
- public function insertRedirectEntry( $rt ) {
- $dbw = wfGetDB( DB_MASTER );
- $dbw->replace( 'redirect', array( 'rd_from' ),
- array(
- 'rd_from' => $this->getId(),
- 'rd_namespace' => $rt->getNamespace(),
- 'rd_title' => $rt->getDBkey(),
- 'rd_fragment' => $rt->getFragment(),
- 'rd_interwiki' => $rt->getInterwiki(),
- ),
- __METHOD__
- );
- }
-
- /**
- * Get the Title object or URL this page redirects to
- *
- * @return bool|Title|string false, Title of in-wiki target, or string with URL
- */
- public function followRedirect() {
- return $this->getRedirectURL( $this->getRedirectTarget() );
- }
-
- /**
- * Get the Title object or URL to use for a redirect. We use Title
- * objects for same-wiki, non-special redirects and URLs for everything
- * else.
- * @param Title $rt Redirect target
- * @return bool|Title|string false, Title object of local target, or string with URL
- */
- public function getRedirectURL( $rt ) {
- if ( !$rt ) {
- return false;
- }
-
- if ( $rt->isExternal() ) {
- if ( $rt->isLocal() ) {
- // Offsite wikis need an HTTP redirect.
- //
- // This can be hard to reverse and may produce loops,
- // so they may be disabled in the site configuration.
- $source = $this->mTitle->getFullURL( 'redirect=no' );
- return $rt->getFullURL( array( 'rdfrom' => $source ) );
- } else {
- // External pages pages without "local" bit set are not valid
- // redirect targets
- return false;
- }
- }
-
- if ( $rt->isSpecialPage() ) {
- // Gotta handle redirects to special pages differently:
- // Fill the HTTP response "Location" header and ignore
- // the rest of the page we're on.
- //
- // Some pages are not valid targets
- if ( $rt->isValidRedirectTarget() ) {
- return $rt->getFullURL();
- } else {
- return false;
- }
- }
-
- return $rt;
- }
-
- /**
- * Get a list of users who have edited this article, not including the user who made
- * the most recent revision, which you can get from $article->getUser() if you want it
- * @return UserArrayFromResult
- */
- public function getContributors() {
- // @todo FIXME: This is expensive; cache this info somewhere.
-
- $dbr = wfGetDB( DB_SLAVE );
-
- if ( $dbr->implicitGroupby() ) {
- $realNameField = 'user_real_name';
- } else {
- $realNameField = 'MIN(user_real_name) AS user_real_name';
- }
-
- $tables = array( 'revision', 'user' );
-
- $fields = array(
- 'user_id' => 'rev_user',
- 'user_name' => 'rev_user_text',
- $realNameField,
- 'timestamp' => 'MAX(rev_timestamp)',
- );
-
- $conds = array( 'rev_page' => $this->getId() );
-
- // The user who made the top revision gets credited as "this page was last edited by
- // John, based on contributions by Tom, Dick and Harry", so don't include them twice.
- $user = $this->getUser();
- if ( $user ) {
- $conds[] = "rev_user != $user";
- } else {
- $conds[] = "rev_user_text != {$dbr->addQuotes( $this->getUserText() )}";
- }
-
- $conds[] = "{$dbr->bitAnd( 'rev_deleted', Revision::DELETED_USER )} = 0"; // username hidden?
-
- $jconds = array(
- 'user' => array( 'LEFT JOIN', 'rev_user = user_id' ),
- );
-
- $options = array(
- 'GROUP BY' => array( 'rev_user', 'rev_user_text' ),
- 'ORDER BY' => 'timestamp DESC',
- );
-
- $res = $dbr->select( $tables, $fields, $conds, __METHOD__, $options, $jconds );
- return new UserArrayFromResult( $res );
- }
-
- /**
- * Get the last N authors
- * @param int $num Number of revisions to get
- * @param int|string $revLatest The latest rev_id, selected from the master (optional)
- * @return array Array of authors, duplicates not removed
- */
- public function getLastNAuthors( $num, $revLatest = 0 ) {
- wfProfileIn( __METHOD__ );
- // First try the slave
- // If that doesn't have the latest revision, try the master
- $continue = 2;
- $db = wfGetDB( DB_SLAVE );
-
- do {
- $res = $db->select( array( 'page', 'revision' ),
- array( 'rev_id', 'rev_user_text' ),
- array(
- 'page_namespace' => $this->mTitle->getNamespace(),
- 'page_title' => $this->mTitle->getDBkey(),
- 'rev_page = page_id'
- ), __METHOD__,
- array(
- 'ORDER BY' => 'rev_timestamp DESC',
- 'LIMIT' => $num
- )
- );
-
- if ( !$res ) {
- wfProfileOut( __METHOD__ );
- return array();
- }
-
- $row = $db->fetchObject( $res );
-
- if ( $continue == 2 && $revLatest && $row->rev_id != $revLatest ) {
- $db = wfGetDB( DB_MASTER );
- $continue--;
- } else {
- $continue = 0;
- }
- } while ( $continue );
-
- $authors = array( $row->rev_user_text );
-
- foreach ( $res as $row ) {
- $authors[] = $row->rev_user_text;
- }
-
- wfProfileOut( __METHOD__ );
- return $authors;
- }
-
- /**
- * Should the parser cache be used?
- *
- * @param ParserOptions $parserOptions ParserOptions to check
- * @param int $oldid
- * @return bool
- */
- public function isParserCacheUsed( ParserOptions $parserOptions, $oldid ) {
- global $wgEnableParserCache;
-
- return $wgEnableParserCache
- && $parserOptions->getStubThreshold() == 0
- && $this->exists()
- && ( $oldid === null || $oldid === 0 || $oldid === $this->getLatest() )
- && $this->getContentHandler()->isParserCacheSupported();
- }
-
- /**
- * Get a ParserOutput for the given ParserOptions and revision ID.
- * The parser cache will be used if possible.
- *
- * @since 1.19
- * @param ParserOptions $parserOptions ParserOptions to use for the parse operation
- * @param null|int $oldid Revision ID to get the text from, passing null or 0 will
- * get the current revision (default value)
- *
- * @return ParserOutput|bool ParserOutput or false if the revision was not found
- */
- public function getParserOutput( ParserOptions $parserOptions, $oldid = null ) {
- wfProfileIn( __METHOD__ );
-
- $useParserCache = $this->isParserCacheUsed( $parserOptions, $oldid );
- wfDebug( __METHOD__ . ': using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
- if ( $parserOptions->getStubThreshold() ) {
- wfIncrStats( 'pcache_miss_stub' );
- }
-
- if ( $useParserCache ) {
- $parserOutput = ParserCache::singleton()->get( $this, $parserOptions );
- if ( $parserOutput !== false ) {
- wfProfileOut( __METHOD__ );
- return $parserOutput;
- }
- }
-
- if ( $oldid === null || $oldid === 0 ) {
- $oldid = $this->getLatest();
- }
-
- $pool = new PoolWorkArticleView( $this, $parserOptions, $oldid, $useParserCache );
- $pool->execute();
-
- wfProfileOut( __METHOD__ );
-
- return $pool->getParserOutput();
- }
-
- /**
- * Do standard deferred updates after page view (existing or missing page)
- * @param User $user The relevant user
- * @param int $oldid The revision id being viewed. If not given or 0, latest revision is assumed.
- */
- public function doViewUpdates( User $user, $oldid = 0 ) {
- global $wgDisableCounters;
- if ( wfReadOnly() ) {
- return;
- }
-
- // Don't update page view counters on views from bot users (bug 14044)
- if ( !$wgDisableCounters && !$user->isAllowed( 'bot' ) && $this->exists() ) {
- DeferredUpdates::addUpdate( new ViewCountUpdate( $this->getId() ) );
- DeferredUpdates::addUpdate( new SiteStatsUpdate( 1, 0, 0 ) );
- }
-
- // Update newtalk / watchlist notification status
- $user->clearNotification( $this->mTitle, $oldid );
- }
-
- /**
- * Perform the actions of a page purging
- * @return bool
- */
- public function doPurge() {
- global $wgUseSquid;
-
- if ( !wfRunHooks( 'ArticlePurge', array( &$this ) ) ) {
- return false;
- }
-
- // Invalidate the cache
- $this->mTitle->invalidateCache();
-
- if ( $wgUseSquid ) {
- // Commit the transaction before the purge is sent
- $dbw = wfGetDB( DB_MASTER );
- $dbw->commit( __METHOD__ );
-
- // Send purge
- $update = SquidUpdate::newSimplePurge( $this->mTitle );
- $update->doUpdate();
- }
-
- if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
- // @todo move this logic to MessageCache
-
- if ( $this->exists() ) {
- // NOTE: use transclusion text for messages.
- // This is consistent with MessageCache::getMsgFromNamespace()
-
- $content = $this->getContent();
- $text = $content === null ? null : $content->getWikitextForTransclusion();
-
- if ( $text === null ) {
- $text = false;
- }
- } else {
- $text = false;
- }
-
- MessageCache::singleton()->replace( $this->mTitle->getDBkey(), $text );
- }
- return true;
- }
-
- /**
- * Insert a new empty page record for this article.
- * This *must* be followed up by creating a revision
- * and running $this->updateRevisionOn( ... );
- * or else the record will be left in a funky state.
- * Best if all done inside a transaction.
- *
- * @param DatabaseBase $dbw
- * @return int The newly created page_id key, or false if the title already existed
- */
- public function insertOn( $dbw ) {
- wfProfileIn( __METHOD__ );
-
- $page_id = $dbw->nextSequenceValue( 'page_page_id_seq' );
- $dbw->insert( 'page', array(
- 'page_id' => $page_id,
- 'page_namespace' => $this->mTitle->getNamespace(),
- 'page_title' => $this->mTitle->getDBkey(),
- 'page_counter' => 0,
- 'page_restrictions' => '',
- 'page_is_redirect' => 0, // Will set this shortly...
- 'page_is_new' => 1,
- 'page_random' => wfRandom(),
- 'page_touched' => $dbw->timestamp(),
- 'page_latest' => 0, // Fill this in shortly...
- 'page_len' => 0, // Fill this in shortly...
- ), __METHOD__, 'IGNORE' );
-
- $affected = $dbw->affectedRows();
-
- if ( $affected ) {
- $newid = $dbw->insertId();
- $this->mId = $newid;
- $this->mTitle->resetArticleID( $newid );
- }
- wfProfileOut( __METHOD__ );
-
- return $affected ? $newid : false;
- }
-
- /**
- * Update the page record to point to a newly saved revision.
- *
- * @param DatabaseBase $dbw
- * @param Revision $revision For ID number, and text used to set
- * length and redirect status fields
- * @param int $lastRevision If given, will not overwrite the page field
- * when different from the currently set value.
- * Giving 0 indicates the new page flag should be set on.
- * @param bool $lastRevIsRedirect If given, will optimize adding and
- * removing rows in redirect table.
- * @return bool true on success, false on failure
- */
- public function updateRevisionOn( $dbw, $revision, $lastRevision = null,
- $lastRevIsRedirect = null
- ) {
- global $wgContentHandlerUseDB;
-
- wfProfileIn( __METHOD__ );
-
- $content = $revision->getContent();
- $len = $content ? $content->getSize() : 0;
- $rt = $content ? $content->getUltimateRedirectTarget() : null;
-
- $conditions = array( 'page_id' => $this->getId() );
-
- if ( !is_null( $lastRevision ) ) {
- // An extra check against threads stepping on each other
- $conditions['page_latest'] = $lastRevision;
- }
-
- $now = wfTimestampNow();
- $row = array( /* SET */
- 'page_latest' => $revision->getId(),
- 'page_touched' => $dbw->timestamp( $now ),
- 'page_is_new' => ( $lastRevision === 0 ) ? 1 : 0,
- 'page_is_redirect' => $rt !== null ? 1 : 0,
- 'page_len' => $len,
- );
-
- if ( $wgContentHandlerUseDB ) {
- $row['page_content_model'] = $revision->getContentModel();
- }
-
- $dbw->update( 'page',
- $row,
- $conditions,
- __METHOD__ );
-
- $result = $dbw->affectedRows() > 0;
- if ( $result ) {
- $this->updateRedirectOn( $dbw, $rt, $lastRevIsRedirect );
- $this->setLastEdit( $revision );
- $this->setCachedLastEditTime( $now );
- $this->mLatest = $revision->getId();
- $this->mIsRedirect = (bool)$rt;
- // Update the LinkCache.
- LinkCache::singleton()->addGoodLinkObj( $this->getId(), $this->mTitle, $len, $this->mIsRedirect,
- $this->mLatest, $revision->getContentModel() );
- }
-
- wfProfileOut( __METHOD__ );
- return $result;
- }
-
- /**
- * Add row to the redirect table if this is a redirect, remove otherwise.
- *
- * @param DatabaseBase $dbw
- * @param Title $redirectTitle Title object pointing to the redirect target,
- * or NULL if this is not a redirect
- * @param null|bool $lastRevIsRedirect If given, will optimize adding and
- * removing rows in redirect table.
- * @return bool true on success, false on failure
- * @private
- */
- public function updateRedirectOn( $dbw, $redirectTitle, $lastRevIsRedirect = null ) {
- // Always update redirects (target link might have changed)
- // Update/Insert if we don't know if the last revision was a redirect or not
- // Delete if changing from redirect to non-redirect
- $isRedirect = !is_null( $redirectTitle );
-
- if ( !$isRedirect && $lastRevIsRedirect === false ) {
- return true;
- }
-
- wfProfileIn( __METHOD__ );
- if ( $isRedirect ) {
- $this->insertRedirectEntry( $redirectTitle );
- } else {
- // This is not a redirect, remove row from redirect table
- $where = array( 'rd_from' => $this->getId() );
- $dbw->delete( 'redirect', $where, __METHOD__ );
- }
-
- if ( $this->getTitle()->getNamespace() == NS_FILE ) {
- RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $this->getTitle() );
- }
- wfProfileOut( __METHOD__ );
-
- return ( $dbw->affectedRows() != 0 );
- }
-
- /**
- * If the given revision is newer than the currently set page_latest,
- * update the page record. Otherwise, do nothing.
- *
- * @deprecated since 1.24, use updateRevisionOn instead
- *
- * @param DatabaseBase $dbw
- * @param Revision $revision
- * @return bool
- */
- public function updateIfNewerOn( $dbw, $revision ) {
- wfProfileIn( __METHOD__ );
-
- $row = $dbw->selectRow(
- array( 'revision', 'page' ),
- array( 'rev_id', 'rev_timestamp', 'page_is_redirect' ),
- array(
- 'page_id' => $this->getId(),
- 'page_latest=rev_id' ),
- __METHOD__ );
-
- if ( $row ) {
- if ( wfTimestamp( TS_MW, $row->rev_timestamp ) >= $revision->getTimestamp() ) {
- wfProfileOut( __METHOD__ );
- return false;
- }
- $prev = $row->rev_id;
- $lastRevIsRedirect = (bool)$row->page_is_redirect;
- } else {
- // No or missing previous revision; mark the page as new
- $prev = 0;
- $lastRevIsRedirect = null;
- }
-
- $ret = $this->updateRevisionOn( $dbw, $revision, $prev, $lastRevIsRedirect );
-
- wfProfileOut( __METHOD__ );
- return $ret;
- }
-
- /**
- * Get the content that needs to be saved in order to undo all revisions
- * between $undo and $undoafter. Revisions must belong to the same page,
- * must exist and must not be deleted
- * @param Revision $undo
- * @param Revision $undoafter Must be an earlier revision than $undo
- * @return mixed string on success, false on failure
- * @since 1.21
- * Before we had the Content object, this was done in getUndoText
- */
- public function getUndoContent( Revision $undo, Revision $undoafter = null ) {
- $handler = $undo->getContentHandler();
- return $handler->getUndoContent( $this->getRevision(), $undo, $undoafter );
- }
-
- /**
- * Get the text that needs to be saved in order to undo all revisions
- * between $undo and $undoafter. Revisions must belong to the same page,
- * must exist and must not be deleted
- * @param Revision $undo
- * @param Revision $undoafter Must be an earlier revision than $undo
- * @return string|bool string on success, false on failure
- * @deprecated since 1.21: use ContentHandler::getUndoContent() instead.
- */
- public function getUndoText( Revision $undo, Revision $undoafter = null ) {
- ContentHandler::deprecated( __METHOD__, '1.21' );
-
- $this->loadLastEdit();
-
- if ( $this->mLastRevision ) {
- if ( is_null( $undoafter ) ) {
- $undoafter = $undo->getPrevious();
- }
-
- $handler = $this->getContentHandler();
- $undone = $handler->getUndoContent( $this->mLastRevision, $undo, $undoafter );
-
- if ( !$undone ) {
- return false;
- } else {
- return ContentHandler::getContentText( $undone );
- }
- }
-
- return false;
- }
-
- /**
- * @param string|null|bool $section Null/false, a section number (0, 1, 2, T1, T2, ...) or "new".
- * @param string $text New text of the section.
- * @param string $sectionTitle New section's subject, only if $section is "new".
- * @param string $edittime Revision timestamp or null to use the current revision.
- *
- * @throws MWException
- * @return string New complete article text, or null if error.
- *
- * @deprecated since 1.21, use replaceSectionAtRev() instead
- */
- public function replaceSection( $section, $text, $sectionTitle = '',
- $edittime = null
- ) {
- ContentHandler::deprecated( __METHOD__, '1.21' );
-
- //NOTE: keep condition in sync with condition in replaceSectionContent!
- if ( strval( $section ) == '' ) {
- // Whole-page edit; let the whole text through
- return $text;
- }
-
- if ( !$this->supportsSections() ) {
- throw new MWException( "sections not supported for content model " .
- $this->getContentHandler()->getModelID() );
- }
-
- // could even make section title, but that's not required.
- $sectionContent = ContentHandler::makeContent( $text, $this->getTitle() );
-
- $newContent = $this->replaceSectionContent( $section, $sectionContent, $sectionTitle,
- $edittime );
-
- return ContentHandler::getContentText( $newContent );
- }
-
- /**
- * Returns true if this page's content model supports sections.
- *
- * @return bool
- *
- * @todo The skin should check this and not offer section functionality if
- * sections are not supported.
- * @todo The EditPage should check this and not offer section functionality
- * if sections are not supported.
- */
- public function supportsSections() {
- return $this->getContentHandler()->supportsSections();
- }
-
- /**
- * @param string|null|bool $section Null/false, a section number (0, 1, 2, T1, T2, ...) or "new".
- * @param Content $sectionContent New content of the section.
- * @param string $sectionTitle New section's subject, only if $section is "new".
- * @param string $edittime Revision timestamp or null to use the current revision.
- *
- * @throws MWException
- * @return Content New complete article content, or null if error.
- *
- * @since 1.21
- * @deprecated since 1.24, use replaceSectionAtRev instead
- */
- public function replaceSectionContent( $section, Content $sectionContent, $sectionTitle = '',
- $edittime = null ) {
- wfProfileIn( __METHOD__ );
-
- $baseRevId = null;
- if ( $edittime && $section !== 'new' ) {
- $dbw = wfGetDB( DB_MASTER );
- $rev = Revision::loadFromTimestamp( $dbw, $this->mTitle, $edittime );
- if ( $rev ) {
- $baseRevId = $rev->getId();
- }
- }
-
- wfProfileOut( __METHOD__ );
- return $this->replaceSectionAtRev( $section, $sectionContent, $sectionTitle, $baseRevId );
- }
-
- /**
- * @param string|null|bool $section Null/false, a section number (0, 1, 2, T1, T2, ...) or "new".
- * @param Content $sectionContent New content of the section.
- * @param string $sectionTitle New section's subject, only if $section is "new".
- * @param string $baseRevId integer|null
- *
- * @throws MWException
- * @return Content New complete article content, or null if error.
- *
- * @since 1.24
- */
- public function replaceSectionAtRev( $section, Content $sectionContent,
- $sectionTitle = '', $baseRevId = null
- ) {
- wfProfileIn( __METHOD__ );
-
- if ( strval( $section ) == '' ) {
- // Whole-page edit; let the whole text through
- $newContent = $sectionContent;
- } else {
- if ( !$this->supportsSections() ) {
- wfProfileOut( __METHOD__ );
- throw new MWException( "sections not supported for content model " .
- $this->getContentHandler()->getModelID() );
- }
-
- // Bug 30711: always use current version when adding a new section
- if ( is_null( $baseRevId ) || $section == 'new' ) {
- $oldContent = $this->getContent();
- } else {
- // TODO: try DB_SLAVE first
- $dbw = wfGetDB( DB_MASTER );
- $rev = Revision::loadFromId( $dbw, $baseRevId );
-
- if ( !$rev ) {
- wfDebug( __METHOD__ . " asked for bogus section (page: " .
- $this->getId() . "; section: $section)\n" );
- wfProfileOut( __METHOD__ );
- return null;
- }
-
- $oldContent = $rev->getContent();
- }
-
- if ( ! $oldContent ) {
- wfDebug( __METHOD__ . ": no page text\n" );
- wfProfileOut( __METHOD__ );
- return null;
- }
-
- $newContent = $oldContent->replaceSection( $section, $sectionContent, $sectionTitle );
- }
-
- wfProfileOut( __METHOD__ );
- return $newContent;
- }
-
- /**
- * Check flags and add EDIT_NEW or EDIT_UPDATE to them as needed.
- * @param int $flags
- * @return int Updated $flags
- */
- public function checkFlags( $flags ) {
- if ( !( $flags & EDIT_NEW ) && !( $flags & EDIT_UPDATE ) ) {
- if ( $this->exists() ) {
- $flags |= EDIT_UPDATE;
- } else {
- $flags |= EDIT_NEW;
- }
- }
-
- return $flags;
- }
-
- /**
- * Change an existing article or create a new article. Updates RC and all necessary caches,
- * optionally via the deferred update array.
- *
- * @param string $text New text
- * @param string $summary Edit summary
- * @param int $flags Bitfield:
- * EDIT_NEW
- * Article is known or assumed to be non-existent, create a new one
- * EDIT_UPDATE
- * Article is known or assumed to be pre-existing, update it
- * EDIT_MINOR
- * Mark this edit minor, if the user is allowed to do so
- * EDIT_SUPPRESS_RC
- * Do not log the change in recentchanges
- * EDIT_FORCE_BOT
- * Mark the edit a "bot" edit regardless of user rights
- * EDIT_DEFER_UPDATES
- * Defer some of the updates until the end of index.php
- * EDIT_AUTOSUMMARY
- * Fill in blank summaries with generated text where possible
- *
- * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the
- * article will be detected. If EDIT_UPDATE is specified and the article
- * doesn't exist, the function will return an edit-gone-missing error. If
- * EDIT_NEW is specified and the article does exist, an edit-already-exists
- * error will be returned. These two conditions are also possible with
- * auto-detection due to MediaWiki's performance-optimised locking strategy.
- *
- * @param bool|int $baseRevId The revision ID this edit was based off, if any
- * @param User $user The user doing the edit
- *
- * @throws MWException
- * @return Status object. Possible errors:
- * edit-hook-aborted: The ArticleSave hook aborted the edit but didn't
- * set the fatal flag of $status
- * edit-gone-missing: In update mode, but the article didn't exist.
- * edit-conflict: In update mode, the article changed unexpectedly.
- * edit-no-change: Warning that the text was the same as before.
- * edit-already-exists: In creation mode, but the article already exists.
- *
- * Extensions may define additional errors.
- *
- * $return->value will contain an associative array with members as follows:
- * new: Boolean indicating if the function attempted to create a new article.
- * revision: The revision object for the inserted revision, or null.
- *
- * Compatibility note: this function previously returned a boolean value
- * indicating success/failure
- *
- * @deprecated since 1.21: use doEditContent() instead.
- */
- public function doEdit( $text, $summary, $flags = 0, $baseRevId = false, $user = null ) {
- ContentHandler::deprecated( __METHOD__, '1.21' );
-
- $content = ContentHandler::makeContent( $text, $this->getTitle() );
-
- return $this->doEditContent( $content, $summary, $flags, $baseRevId, $user );
- }
-
- /**
- * Change an existing article or create a new article. Updates RC and all necessary caches,
- * optionally via the deferred update array.
- *
- * @param Content $content New content
- * @param string $summary Edit summary
- * @param int $flags Bitfield:
- * EDIT_NEW
- * Article is known or assumed to be non-existent, create a new one
- * EDIT_UPDATE
- * Article is known or assumed to be pre-existing, update it
- * EDIT_MINOR
- * Mark this edit minor, if the user is allowed to do so
- * EDIT_SUPPRESS_RC
- * Do not log the change in recentchanges
- * EDIT_FORCE_BOT
- * Mark the edit a "bot" edit regardless of user rights
- * EDIT_DEFER_UPDATES
- * Defer some of the updates until the end of index.php
- * EDIT_AUTOSUMMARY
- * Fill in blank summaries with generated text where possible
- *
- * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the
- * article will be detected. If EDIT_UPDATE is specified and the article
- * doesn't exist, the function will return an edit-gone-missing error. If
- * EDIT_NEW is specified and the article does exist, an edit-already-exists
- * error will be returned. These two conditions are also possible with
- * auto-detection due to MediaWiki's performance-optimised locking strategy.
- *
- * @param bool|int $baseRevId The revision ID this edit was based off, if any
- * @param User $user The user doing the edit
- * @param string $serialisation_format Format for storing the content in the
- * database.
- *
- * @throws MWException
- * @return Status object. Possible errors:
- * edit-hook-aborted: The ArticleSave hook aborted the edit but didn't
- * set the fatal flag of $status.
- * edit-gone-missing: In update mode, but the article didn't exist.
- * edit-conflict: In update mode, the article changed unexpectedly.
- * edit-no-change: Warning that the text was the same as before.
- * edit-already-exists: In creation mode, but the article already exists.
- *
- * Extensions may define additional errors.
- *
- * $return->value will contain an associative array with members as follows:
- * new: Boolean indicating if the function attempted to create a new article.
- * revision: The revision object for the inserted revision, or null.
- *
- * @since 1.21
- */
- public function doEditContent( Content $content, $summary, $flags = 0, $baseRevId = false,
- User $user = null, $serialisation_format = null
- ) {
- global $wgUser, $wgUseAutomaticEditSummaries, $wgUseRCPatrol, $wgUseNPPatrol;
-
- // Low-level sanity check
- if ( $this->mTitle->getText() === '' ) {
- throw new MWException( 'Something is trying to edit an article with an empty title' );
- }
-
- wfProfileIn( __METHOD__ );
-
- if ( !$content->getContentHandler()->canBeUsedOn( $this->getTitle() ) ) {
- wfProfileOut( __METHOD__ );
- return Status::newFatal( 'content-not-allowed-here',
- ContentHandler::getLocalizedName( $content->getModel() ),
- $this->getTitle()->getPrefixedText() );
- }
-
- $user = is_null( $user ) ? $wgUser : $user;
- $status = Status::newGood( array() );
-
- // Load the data from the master database if needed.
- // The caller may already loaded it from the master or even loaded it using
- // SELECT FOR UPDATE, so do not override that using clear().
- $this->loadPageData( 'fromdbmaster' );
-
- $flags = $this->checkFlags( $flags );
-
- // handle hook
- $hook_args = array( &$this, &$user, &$content, &$summary,
- $flags & EDIT_MINOR, null, null, &$flags, &$status );
-
- if ( !wfRunHooks( 'PageContentSave', $hook_args )
- || !ContentHandler::runLegacyHooks( 'ArticleSave', $hook_args ) ) {
-
- wfDebug( __METHOD__ . ": ArticleSave or ArticleSaveContent hook aborted save!\n" );
-
- if ( $status->isOK() ) {
- $status->fatal( 'edit-hook-aborted' );
- }
-
- wfProfileOut( __METHOD__ );
- return $status;
- }
-
- // Silently ignore EDIT_MINOR if not allowed
- $isminor = ( $flags & EDIT_MINOR ) && $user->isAllowed( 'minoredit' );
- $bot = $flags & EDIT_FORCE_BOT;
-
- $old_content = $this->getContent( Revision::RAW ); // current revision's content
-
- $oldsize = $old_content ? $old_content->getSize() : 0;
- $oldid = $this->getLatest();
- $oldIsRedirect = $this->isRedirect();
- $oldcountable = $this->isCountable();
-
- $handler = $content->getContentHandler();
-
- // Provide autosummaries if one is not provided and autosummaries are enabled.
- if ( $wgUseAutomaticEditSummaries && $flags & EDIT_AUTOSUMMARY && $summary == '' ) {
- if ( !$old_content ) {
- $old_content = null;
- }
- $summary = $handler->getAutosummary( $old_content, $content, $flags );
- }
-
- $editInfo = $this->prepareContentForEdit( $content, null, $user, $serialisation_format );
- $serialized = $editInfo->pst;
-
- /**
- * @var Content $content
- */
- $content = $editInfo->pstContent;
- $newsize = $content->getSize();
-
- $dbw = wfGetDB( DB_MASTER );
- $now = wfTimestampNow();
- $this->mTimestamp = $now;
-
- if ( $flags & EDIT_UPDATE ) {
- // Update article, but only if changed.
- $status->value['new'] = false;
-
- if ( !$oldid ) {
- // Article gone missing
- wfDebug( __METHOD__ . ": EDIT_UPDATE specified but article doesn't exist\n" );
- $status->fatal( 'edit-gone-missing' );
-
- wfProfileOut( __METHOD__ );
- return $status;
- } elseif ( !$old_content ) {
- // Sanity check for bug 37225
- wfProfileOut( __METHOD__ );
- throw new MWException( "Could not find text for current revision {$oldid}." );
- }
-
- $revision = new Revision( array(
- 'page' => $this->getId(),
- 'title' => $this->getTitle(), // for determining the default content model
- 'comment' => $summary,
- 'minor_edit' => $isminor,
- 'text' => $serialized,
- 'len' => $newsize,
- 'parent_id' => $oldid,
- 'user' => $user->getId(),
- 'user_text' => $user->getName(),
- 'timestamp' => $now,
- 'content_model' => $content->getModel(),
- 'content_format' => $serialisation_format,
- ) ); // XXX: pass content object?!
-
- $changed = !$content->equals( $old_content );
-
- if ( $changed ) {
- if ( !$content->isValid() ) {
- wfProfileOut( __METHOD__ );
- throw new MWException( "New content failed validity check!" );
- }
-
- $dbw->begin( __METHOD__ );
- try {
-
- $prepStatus = $content->prepareSave( $this, $flags, $baseRevId, $user );
- $status->merge( $prepStatus );
-
- if ( !$status->isOK() ) {
- $dbw->rollback( __METHOD__ );
-
- wfProfileOut( __METHOD__ );
- return $status;
- }
- $revisionId = $revision->insertOn( $dbw );
-
- // Update page
- //
- // We check for conflicts by comparing $oldid with the current latest revision ID.
- $ok = $this->updateRevisionOn( $dbw, $revision, $oldid, $oldIsRedirect );
-
- if ( !$ok ) {
- // Belated edit conflict! Run away!!
- $status->fatal( 'edit-conflict' );
-
- $dbw->rollback( __METHOD__ );
-
- wfProfileOut( __METHOD__ );
- return $status;
- }
-
- wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, $baseRevId, $user ) );
- // Update recentchanges
- if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
- // Mark as patrolled if the user can do so
- $patrolled = $wgUseRCPatrol && !count(
- $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
- // Add RC row to the DB
- $rc = RecentChange::notifyEdit( $now, $this->mTitle, $isminor, $user, $summary,
- $oldid, $this->getTimestamp(), $bot, '', $oldsize, $newsize,
- $revisionId, $patrolled
- );
-
- // Log auto-patrolled edits
- if ( $patrolled ) {
- PatrolLog::record( $rc, true, $user );
- }
- }
- $user->incEditCount();
- } catch ( MWException $e ) {
- $dbw->rollback( __METHOD__ );
- // Question: Would it perhaps be better if this method turned all
- // exceptions into $status's?
- throw $e;
- }
- $dbw->commit( __METHOD__ );
- } else {
- // Bug 32948: revision ID must be set to page {{REVISIONID}} and
- // related variables correctly
- $revision->setId( $this->getLatest() );
- }
-
- // Update links tables, site stats, etc.
- $this->doEditUpdates(
- $revision,
- $user,
- array(
- 'changed' => $changed,
- 'oldcountable' => $oldcountable
- )
- );
-
- if ( !$changed ) {
- $status->warning( 'edit-no-change' );
- $revision = null;
- // Update page_touched, this is usually implicit in the page update
- // Other cache updates are done in onArticleEdit()
- $this->mTitle->invalidateCache();
- }
- } else {
- // Create new article
- $status->value['new'] = true;
-
- $dbw->begin( __METHOD__ );
- try {
-
- $prepStatus = $content->prepareSave( $this, $flags, $baseRevId, $user );
- $status->merge( $prepStatus );
-
- if ( !$status->isOK() ) {
- $dbw->rollback( __METHOD__ );
-
- wfProfileOut( __METHOD__ );
- return $status;
- }
-
- $status->merge( $prepStatus );
-
- // Add the page record; stake our claim on this title!
- // This will return false if the article already exists
- $newid = $this->insertOn( $dbw );
-
- if ( $newid === false ) {
- $dbw->rollback( __METHOD__ );
- $status->fatal( 'edit-already-exists' );
-
- wfProfileOut( __METHOD__ );
- return $status;
- }
-
- // Save the revision text...
- $revision = new Revision( array(
- 'page' => $newid,
- 'title' => $this->getTitle(), // for determining the default content model
- 'comment' => $summary,
- 'minor_edit' => $isminor,
- 'text' => $serialized,
- 'len' => $newsize,
- 'user' => $user->getId(),
- 'user_text' => $user->getName(),
- 'timestamp' => $now,
- 'content_model' => $content->getModel(),
- 'content_format' => $serialisation_format,
- ) );
- $revisionId = $revision->insertOn( $dbw );
-
- // Bug 37225: use accessor to get the text as Revision may trim it
- $content = $revision->getContent(); // sanity; get normalized version
-
- if ( $content ) {
- $newsize = $content->getSize();
- }
-
- // Update the page record with revision data
- $this->updateRevisionOn( $dbw, $revision, 0 );
-
- wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
-
- // Update recentchanges
- if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
- // Mark as patrolled if the user can do so
- $patrolled = ( $wgUseRCPatrol || $wgUseNPPatrol ) && !count(
- $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
- // Add RC row to the DB
- $rc = RecentChange::notifyNew( $now, $this->mTitle, $isminor, $user, $summary, $bot,
- '', $newsize, $revisionId, $patrolled );
-
- // Log auto-patrolled edits
- if ( $patrolled ) {
- PatrolLog::record( $rc, true, $user );
- }
- }
- $user->incEditCount();
-
- } catch ( MWException $e ) {
- $dbw->rollback( __METHOD__ );
- throw $e;
- }
- $dbw->commit( __METHOD__ );
-
- // Update links, etc.
- $this->doEditUpdates( $revision, $user, array( 'created' => true ) );
-
- $hook_args = array( &$this, &$user, $content, $summary,
- $flags & EDIT_MINOR, null, null, &$flags, $revision );
-
- ContentHandler::runLegacyHooks( 'ArticleInsertComplete', $hook_args );
- wfRunHooks( 'PageContentInsertComplete', $hook_args );
- }
-
- // Do updates right now unless deferral was requested
- if ( !( $flags & EDIT_DEFER_UPDATES ) ) {
- DeferredUpdates::doUpdates();
- }
-
- // Return the new revision (or null) to the caller
- $status->value['revision'] = $revision;
-
- $hook_args = array( &$this, &$user, $content, $summary,
- $flags & EDIT_MINOR, null, null, &$flags, $revision, &$status, $baseRevId );
-
- ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $hook_args );
- wfRunHooks( 'PageContentSaveComplete', $hook_args );
-
- // Promote user to any groups they meet the criteria for
- $user->addAutopromoteOnceGroups( 'onEdit' );
-
- wfProfileOut( __METHOD__ );
- return $status;
- }
-
- /**
- * Get parser options suitable for rendering the primary article wikitext
- *
- * @see ContentHandler::makeParserOptions
- *
- * @param IContextSource|User|string $context One of the following:
- * - IContextSource: Use the User and the Language of the provided
- * context
- * - User: Use the provided User object and $wgLang for the language,
- * so use an IContextSource object if possible.
- * - 'canonical': Canonical options (anonymous user with default
- * preferences and content language).
- * @return ParserOptions
- */
- public function makeParserOptions( $context ) {
- $options = $this->getContentHandler()->makeParserOptions( $context );
-
- if ( $this->getTitle()->isConversionTable() ) {
- // @todo ConversionTable should become a separate content model, so
- // we don't need special cases like this one.
- $options->disableContentConversion();
- }
-
- return $options;
- }
-
- /**
- * Prepare text which is about to be saved.
- * Returns a stdclass with source, pst and output members
- *
- * @deprecated since 1.21: use prepareContentForEdit instead.
- * @return object
- */
- public function prepareTextForEdit( $text, $revid = null, User $user = null ) {
- ContentHandler::deprecated( __METHOD__, '1.21' );
- $content = ContentHandler::makeContent( $text, $this->getTitle() );
- return $this->prepareContentForEdit( $content, $revid, $user );
- }
-
- /**
- * Prepare content which is about to be saved.
- * Returns a stdclass with source, pst and output members
- *
- * @param Content $content
- * @param int|null $revid
- * @param User|null $user
- * @param string|null $serialization_format
- *
- * @return bool|object
- *
- * @since 1.21
- */
- public function prepareContentForEdit( Content $content, $revid = null, User $user = null,
- $serialization_format = null
- ) {
- global $wgContLang, $wgUser;
- $user = is_null( $user ) ? $wgUser : $user;
- //XXX: check $user->getId() here???
-
- // Use a sane default for $serialization_format, see bug 57026
- if ( $serialization_format === null ) {
- $serialization_format = $content->getContentHandler()->getDefaultFormat();
- }
-
- if ( $this->mPreparedEdit
- && $this->mPreparedEdit->newContent
- && $this->mPreparedEdit->newContent->equals( $content )
- && $this->mPreparedEdit->revid == $revid
- && $this->mPreparedEdit->format == $serialization_format
- // XXX: also check $user here?
- ) {
- // Already prepared
- return $this->mPreparedEdit;
- }
-
- $popts = ParserOptions::newFromUserAndLang( $user, $wgContLang );
- wfRunHooks( 'ArticlePrepareTextForEdit', array( $this, $popts ) );
-
- $edit = (object)array();
- $edit->revid = $revid;
- $edit->timestamp = wfTimestampNow();
-
- $edit->pstContent = $content ? $content->preSaveTransform( $this->mTitle, $user, $popts ) : null;
-
- $edit->format = $serialization_format;
- $edit->popts = $this->makeParserOptions( 'canonical' );
- $edit->output = $edit->pstContent
- ? $edit->pstContent->getParserOutput( $this->mTitle, $revid, $edit->popts )
- : null;
-
- $edit->newContent = $content;
- $edit->oldContent = $this->getContent( Revision::RAW );
-
- // NOTE: B/C for hooks! don't use these fields!
- $edit->newText = $edit->newContent ? ContentHandler::getContentText( $edit->newContent ) : '';
- $edit->oldText = $edit->oldContent ? ContentHandler::getContentText( $edit->oldContent ) : '';
- $edit->pst = $edit->pstContent ? $edit->pstContent->serialize( $serialization_format ) : '';
-
- $this->mPreparedEdit = $edit;
- return $edit;
- }
-
- /**
- * Do standard deferred updates after page edit.
- * Update links tables, site stats, search index and message cache.
- * Purges pages that include this page if the text was changed here.
- * Every 100th edit, prune the recent changes table.
- *
- * @param Revision $revision
- * @param User $user User object that did the revision
- * @param array $options Array of options, following indexes are used:
- * - changed: boolean, whether the revision changed the content (default true)
- * - created: boolean, whether the revision created the page (default false)
- * - oldcountable: boolean or null (default null):
- * - boolean: whether the page was counted as an article before that
- * revision, only used in changed is true and created is false
- * - null: don't change the article count
- */
- public function doEditUpdates( Revision $revision, User $user, array $options = array() ) {
- global $wgEnableParserCache;
-
- wfProfileIn( __METHOD__ );
-
- $options += array( 'changed' => true, 'created' => false, 'oldcountable' => null );
- $content = $revision->getContent();
-
- // Parse the text
- // Be careful not to do pre-save transform twice: $text is usually
- // already pre-save transformed once.
- if ( !$this->mPreparedEdit || $this->mPreparedEdit->output->getFlag( 'vary-revision' ) ) {
- wfDebug( __METHOD__ . ": No prepared edit or vary-revision is set...\n" );
- $editInfo = $this->prepareContentForEdit( $content, $revision->getId(), $user );
- } else {
- wfDebug( __METHOD__ . ": No vary-revision, using prepared edit...\n" );
- $editInfo = $this->mPreparedEdit;
- }
-
- // Save it to the parser cache
- if ( $wgEnableParserCache ) {
- $parserCache = ParserCache::singleton();
- $parserCache->save(
- $editInfo->output, $this, $editInfo->popts, $editInfo->timestamp, $editInfo->revid
- );
- }
-
- // Update the links tables and other secondary data
- if ( $content ) {
- $recursive = $options['changed']; // bug 50785
- $updates = $content->getSecondaryDataUpdates(
- $this->getTitle(), null, $recursive, $editInfo->output );
- DataUpdate::runUpdates( $updates );
- }
-
- wfRunHooks( 'ArticleEditUpdates', array( &$this, &$editInfo, $options['changed'] ) );
-
- if ( wfRunHooks( 'ArticleEditUpdatesDeleteFromRecentchanges', array( &$this ) ) ) {
- if ( 0 == mt_rand( 0, 99 ) ) {
- // Flush old entries from the `recentchanges` table; we do this on
- // random requests so as to avoid an increase in writes for no good reason
- RecentChange::purgeExpiredChanges();
- }
- }
-
- if ( !$this->exists() ) {
- wfProfileOut( __METHOD__ );
- return;
- }
-
- $id = $this->getId();
- $title = $this->mTitle->getPrefixedDBkey();
- $shortTitle = $this->mTitle->getDBkey();
-
- if ( !$options['changed'] ) {
- $good = 0;
- } elseif ( $options['created'] ) {
- $good = (int)$this->isCountable( $editInfo );
- } elseif ( $options['oldcountable'] !== null ) {
- $good = (int)$this->isCountable( $editInfo ) - (int)$options['oldcountable'];
- } else {
- $good = 0;
- }
- $edits = $options['changed'] ? 1 : 0;
- $total = $options['created'] ? 1 : 0;
-
- DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, $edits, $good, $total ) );
- DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $content ) );
-
- // If this is another user's talk page, update newtalk.
- // Don't do this if $options['changed'] = false (null-edits) nor if
- // it's a minor edit and the user doesn't want notifications for those.
- if ( $options['changed']
- && $this->mTitle->getNamespace() == NS_USER_TALK
- && $shortTitle != $user->getTitleKey()
- && !( $revision->isMinor() && $user->isAllowed( 'nominornewtalk' ) )
- ) {
- $recipient = User::newFromName( $shortTitle, false );
- if ( !$recipient ) {
- wfDebug( __METHOD__ . ": invalid username\n" );
- } else {
- // Allow extensions to prevent user notification when a new message is added to their talk page
- if ( wfRunHooks( 'ArticleEditUpdateNewTalk', array( &$this, $recipient ) ) ) {
- if ( User::isIP( $shortTitle ) ) {
- // An anonymous user
- $recipient->setNewtalk( true, $revision );
- } elseif ( $recipient->isLoggedIn() ) {
- $recipient->setNewtalk( true, $revision );
- } else {
- wfDebug( __METHOD__ . ": don't need to notify a nonexistent user\n" );
- }
- }
- }
- }
-
- if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
- // XXX: could skip pseudo-messages like js/css here, based on content model.
- $msgtext = $content ? $content->getWikitextForTransclusion() : null;
- if ( $msgtext === false || $msgtext === null ) {
- $msgtext = '';
- }
-
- MessageCache::singleton()->replace( $shortTitle, $msgtext );
- }
-
- if ( $options['created'] ) {
- self::onArticleCreate( $this->mTitle );
- } elseif ( $options['changed'] ) { // bug 50785
- self::onArticleEdit( $this->mTitle );
- }
-
- wfProfileOut( __METHOD__ );
- }
-
- /**
- * Edit an article without doing all that other stuff
- * The article must already exist; link tables etc
- * are not updated, caches are not flushed.
- *
- * @param string $text Text submitted
- * @param User $user The relevant user
- * @param string $comment Comment submitted
- * @param bool $minor Whereas it's a minor modification
- *
- * @deprecated since 1.21, use doEditContent() instead.
- */
- public function doQuickEdit( $text, User $user, $comment = '', $minor = 0 ) {
- ContentHandler::deprecated( __METHOD__, "1.21" );
-
- $content = ContentHandler::makeContent( $text, $this->getTitle() );
- $this->doQuickEditContent( $content, $user, $comment, $minor );
- }
-
- /**
- * Edit an article without doing all that other stuff
- * The article must already exist; link tables etc
- * are not updated, caches are not flushed.
- *
- * @param Content $content Content submitted
- * @param User $user The relevant user
- * @param string $comment comment submitted
- * @param string $serialisation_format Format for storing the content in the database
- * @param bool $minor Whereas it's a minor modification
- */
- public function doQuickEditContent( Content $content, User $user, $comment = '', $minor = false,
- $serialisation_format = null
- ) {
- wfProfileIn( __METHOD__ );
-
- $serialized = $content->serialize( $serialisation_format );
-
- $dbw = wfGetDB( DB_MASTER );
- $revision = new Revision( array(
- 'title' => $this->getTitle(), // for determining the default content model
- 'page' => $this->getId(),
- 'user_text' => $user->getName(),
- 'user' => $user->getId(),
- 'text' => $serialized,
- 'length' => $content->getSize(),
- 'comment' => $comment,
- 'minor_edit' => $minor ? 1 : 0,
- ) ); // XXX: set the content object?
- $revision->insertOn( $dbw );
- $this->updateRevisionOn( $dbw, $revision );
-
- wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
-
- wfProfileOut( __METHOD__ );
- }
-
- /**
- * Update the article's restriction field, and leave a log entry.
- * This works for protection both existing and non-existing pages.
- *
- * @param array $limit Set of restriction keys
- * @param array $expiry Per restriction type expiration
- * @param int &$cascade Set to false if cascading protection isn't allowed.
- * @param string $reason
- * @param User $user The user updating the restrictions
- * @return Status
- */
- public function doUpdateRestrictions( array $limit, array $expiry,
- &$cascade, $reason, User $user
- ) {
- global $wgCascadingRestrictionLevels, $wgContLang;
-
- if ( wfReadOnly() ) {
- return Status::newFatal( 'readonlytext', wfReadOnlyReason() );
- }
-
- $this->loadPageData( 'fromdbmaster' );
- $restrictionTypes = $this->mTitle->getRestrictionTypes();
- $id = $this->getId();
-
- if ( !$cascade ) {
- $cascade = false;
- }
-
- // Take this opportunity to purge out expired restrictions
- Title::purgeExpiredRestrictions();
-
- // @todo FIXME: Same limitations as described in ProtectionForm.php (line 37);
- // we expect a single selection, but the schema allows otherwise.
- $isProtected = false;
- $protect = false;
- $changed = false;
-
- $dbw = wfGetDB( DB_MASTER );
-
- foreach ( $restrictionTypes as $action ) {
- if ( !isset( $expiry[$action] ) ) {
- $expiry[$action] = $dbw->getInfinity();
- }
- if ( !isset( $limit[$action] ) ) {
- $limit[$action] = '';
- } elseif ( $limit[$action] != '' ) {
- $protect = true;
- }
-
- // Get current restrictions on $action
- $current = implode( '', $this->mTitle->getRestrictions( $action ) );
- if ( $current != '' ) {
- $isProtected = true;
- }
-
- if ( $limit[$action] != $current ) {
- $changed = true;
- } elseif ( $limit[$action] != '' ) {
- // Only check expiry change if the action is actually being
- // protected, since expiry does nothing on an not-protected
- // action.
- if ( $this->mTitle->getRestrictionExpiry( $action ) != $expiry[$action] ) {
- $changed = true;
- }
- }
- }
-
- if ( !$changed && $protect && $this->mTitle->areRestrictionsCascading() != $cascade ) {
- $changed = true;
- }
-
- // If nothing has changed, do nothing
- if ( !$changed ) {
- return Status::newGood();
- }
-
- if ( !$protect ) { // No protection at all means unprotection
- $revCommentMsg = 'unprotectedarticle';
- $logAction = 'unprotect';
- } elseif ( $isProtected ) {
- $revCommentMsg = 'modifiedarticleprotection';
- $logAction = 'modify';
- } else {
- $revCommentMsg = 'protectedarticle';
- $logAction = 'protect';
- }
-
- // Truncate for whole multibyte characters
- $reason = $wgContLang->truncate( $reason, 255 );
-
- $logRelationsValues = array();
- $logRelationsField = null;
-
- if ( $id ) { // Protection of existing page
- if ( !wfRunHooks( 'ArticleProtect', array( &$this, &$user, $limit, $reason ) ) ) {
- return Status::newGood();
- }
-
- // Only certain restrictions can cascade...
- $editrestriction = isset( $limit['edit'] )
- ? array( $limit['edit'] )
- : $this->mTitle->getRestrictions( 'edit' );
- foreach ( array_keys( $editrestriction, 'sysop' ) as $key ) {
- $editrestriction[$key] = 'editprotected'; // backwards compatibility
- }
- foreach ( array_keys( $editrestriction, 'autoconfirmed' ) as $key ) {
- $editrestriction[$key] = 'editsemiprotected'; // backwards compatibility
- }
-
- $cascadingRestrictionLevels = $wgCascadingRestrictionLevels;
- foreach ( array_keys( $cascadingRestrictionLevels, 'sysop' ) as $key ) {
- $cascadingRestrictionLevels[$key] = 'editprotected'; // backwards compatibility
- }
- foreach ( array_keys( $cascadingRestrictionLevels, 'autoconfirmed' ) as $key ) {
- $cascadingRestrictionLevels[$key] = 'editsemiprotected'; // backwards compatibility
- }
-
- // The schema allows multiple restrictions
- if ( !array_intersect( $editrestriction, $cascadingRestrictionLevels ) ) {
- $cascade = false;
- }
-
- // insert null revision to identify the page protection change as edit summary
- $latest = $this->getLatest();
- $nullRevision = $this->insertProtectNullRevision(
- $revCommentMsg,
- $limit,
- $expiry,
- $cascade,
- $reason,
- $user
- );
-
- if ( $nullRevision === null ) {
- return Status::newFatal( 'no-null-revision', $this->mTitle->getPrefixedText() );
- }
-
- $logRelationsField = 'pr_id';
-
- // Update restrictions table
- foreach ( $limit as $action => $restrictions ) {
- $dbw->delete(
- 'page_restrictions',
- array(
- 'pr_page' => $id,
- 'pr_type' => $action
- ),
- __METHOD__
- );
- if ( $restrictions != '' ) {
- $dbw->insert(
- 'page_restrictions',
- array(
- 'pr_id' => $dbw->nextSequenceValue( 'page_restrictions_pr_id_seq' ),
- 'pr_page' => $id,
- 'pr_type' => $action,
- 'pr_level' => $restrictions,
- 'pr_cascade' => ( $cascade && $action == 'edit' ) ? 1 : 0,
- 'pr_expiry' => $dbw->encodeExpiry( $expiry[$action] )
- ),
- __METHOD__
- );
- $logRelationsValues[] = $dbw->insertId();
- }
- }
-
- // Clear out legacy restriction fields
- $dbw->update(
- 'page',
- array( 'page_restrictions' => '' ),
- array( 'page_id' => $id ),
- __METHOD__
- );
-
- wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $nullRevision, $latest, $user ) );
- wfRunHooks( 'ArticleProtectComplete', array( &$this, &$user, $limit, $reason ) );
- } else { // Protection of non-existing page (also known as "title protection")
- // Cascade protection is meaningless in this case
- $cascade = false;
-
- if ( $limit['create'] != '' ) {
- $dbw->replace( 'protected_titles',
- array( array( 'pt_namespace', 'pt_title' ) ),
- array(
- 'pt_namespace' => $this->mTitle->getNamespace(),
- 'pt_title' => $this->mTitle->getDBkey(),
- 'pt_create_perm' => $limit['create'],
- 'pt_timestamp' => $dbw->timestamp(),
- 'pt_expiry' => $dbw->encodeExpiry( $expiry['create'] ),
- 'pt_user' => $user->getId(),
- 'pt_reason' => $reason,
- ), __METHOD__
- );
- } else {
- $dbw->delete( 'protected_titles',
- array(
- 'pt_namespace' => $this->mTitle->getNamespace(),
- 'pt_title' => $this->mTitle->getDBkey()
- ), __METHOD__
- );
- }
- }
-
- $this->mTitle->flushRestrictions();
- InfoAction::invalidateCache( $this->mTitle );
-
- if ( $logAction == 'unprotect' ) {
- $params = array();
- } else {
- $protectDescriptionLog = $this->protectDescriptionLog( $limit, $expiry );
- $params = array( $protectDescriptionLog, $cascade ? 'cascade' : '' );
- }
-
- // Update the protection log
- $log = new LogPage( 'protect' );
- $logId = $log->addEntry( $logAction, $this->mTitle, $reason, $params, $user );
- if ( $logRelationsField !== null && count( $logRelationsValues ) ) {
- $log->addRelations( $logRelationsField, $logRelationsValues, $logId );
- }
-
- return Status::newGood();
- }
-
- /**
- * Insert a new null revision for this page.
- *
- * @param string $revCommentMsg Comment message key for the revision
- * @param array $limit Set of restriction keys
- * @param array $expiry Per restriction type expiration
- * @param int $cascade Set to false if cascading protection isn't allowed.
- * @param string $reason
- * @param User|null $user
- * @return Revision|null Null on error
- */
- public function insertProtectNullRevision( $revCommentMsg, array $limit,
- array $expiry, $cascade, $reason, $user = null
- ) {
- global $wgContLang;
- $dbw = wfGetDB( DB_MASTER );
-
- // Prepare a null revision to be added to the history
- $editComment = $wgContLang->ucfirst(
- wfMessage(
- $revCommentMsg,
- $this->mTitle->getPrefixedText()
- )->inContentLanguage()->text()
- );
- if ( $reason ) {
- $editComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
- }
- $protectDescription = $this->protectDescription( $limit, $expiry );
- if ( $protectDescription ) {
- $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
- $editComment .= wfMessage( 'parentheses' )->params( $protectDescription )
- ->inContentLanguage()->text();
- }
- if ( $cascade ) {
- $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
- $editComment .= wfMessage( 'brackets' )->params(
- wfMessage( 'protect-summary-cascade' )->inContentLanguage()->text()
- )->inContentLanguage()->text();
- }
-
- $nullRev = Revision::newNullRevision( $dbw, $this->getId(), $editComment, true, $user );
- if ( $nullRev ) {
- $nullRev->insertOn( $dbw );
-
- // Update page record and touch page
- $oldLatest = $nullRev->getParentId();
- $this->updateRevisionOn( $dbw, $nullRev, $oldLatest );
- }
-
- return $nullRev;
- }
-
- /**
- * @param string $expiry 14-char timestamp or "infinity", or false if the input was invalid
- * @return string
- */
- protected function formatExpiry( $expiry ) {
- global $wgContLang;
- $dbr = wfGetDB( DB_SLAVE );
-
- $encodedExpiry = $dbr->encodeExpiry( $expiry );
- if ( $encodedExpiry != 'infinity' ) {
- return wfMessage(
- 'protect-expiring',
- $wgContLang->timeanddate( $expiry, false, false ),
- $wgContLang->date( $expiry, false, false ),
- $wgContLang->time( $expiry, false, false )
- )->inContentLanguage()->text();
- } else {
- return wfMessage( 'protect-expiry-indefinite' )
- ->inContentLanguage()->text();
- }
- }
-
- /**
- * Builds the description to serve as comment for the edit.
- *
- * @param array $limit Set of restriction keys
- * @param array $expiry Per restriction type expiration
- * @return string
- */
- public function protectDescription( array $limit, array $expiry ) {
- $protectDescription = '';
-
- foreach ( array_filter( $limit ) as $action => $restrictions ) {
- # $action is one of $wgRestrictionTypes = array( 'create', 'edit', 'move', 'upload' ).
- # All possible message keys are listed here for easier grepping:
- # * restriction-create
- # * restriction-edit
- # * restriction-move
- # * restriction-upload
- $actionText = wfMessage( 'restriction-' . $action )->inContentLanguage()->text();
- # $restrictions is one of $wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' ),
- # with '' filtered out. All possible message keys are listed below:
- # * protect-level-autoconfirmed
- # * protect-level-sysop
- $restrictionsText = wfMessage( 'protect-level-' . $restrictions )->inContentLanguage()->text();
-
- $expiryText = $this->formatExpiry( $expiry[$action] );
-
- if ( $protectDescription !== '' ) {
- $protectDescription .= wfMessage( 'word-separator' )->inContentLanguage()->text();
- }
- $protectDescription .= wfMessage( 'protect-summary-desc' )
- ->params( $actionText, $restrictionsText, $expiryText )
- ->inContentLanguage()->text();
- }
-
- return $protectDescription;
- }
-
- /**
- * Builds the description to serve as comment for the log entry.
- *
- * Some bots may parse IRC lines, which are generated from log entries which contain plain
- * protect description text. Keep them in old format to avoid breaking compatibility.
- * TODO: Fix protection log to store structured description and format it on-the-fly.
- *
- * @param array $limit Set of restriction keys
- * @param array $expiry Per restriction type expiration
- * @return string
- */
- public function protectDescriptionLog( array $limit, array $expiry ) {
- global $wgContLang;
-
- $protectDescriptionLog = '';
-
- foreach ( array_filter( $limit ) as $action => $restrictions ) {
- $expiryText = $this->formatExpiry( $expiry[$action] );
- $protectDescriptionLog .= $wgContLang->getDirMark() . "[$action=$restrictions] ($expiryText)";
- }
-
- return trim( $protectDescriptionLog );
- }
-
- /**
- * Take an array of page restrictions and flatten it to a string
- * suitable for insertion into the page_restrictions field.
- *
- * @param string[] $limit
- *
- * @throws MWException
- * @return string
- */
- protected static function flattenRestrictions( $limit ) {
- if ( !is_array( $limit ) ) {
- throw new MWException( 'WikiPage::flattenRestrictions given non-array restriction set' );
- }
-
- $bits = array();
- ksort( $limit );
-
- foreach ( array_filter( $limit ) as $action => $restrictions ) {
- $bits[] = "$action=$restrictions";
- }
-
- return implode( ':', $bits );
- }
-
- /**
- * Same as doDeleteArticleReal(), but returns a simple boolean. This is kept around for
- * backwards compatibility, if you care about error reporting you should use
- * doDeleteArticleReal() instead.
- *
- * Deletes the article with database consistency, writes logs, purges caches
- *
- * @param string $reason Delete reason for deletion log
- * @param bool $suppress Suppress all revisions and log the deletion in
- * the suppression log instead of the deletion log
- * @param int $id Article ID
- * @param bool $commit Defaults to true, triggers transaction end
- * @param array &$error Array of errors to append to
- * @param User $user The deleting user
- * @return bool true if successful
- */
- public function doDeleteArticle(
- $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
- ) {
- $status = $this->doDeleteArticleReal( $reason, $suppress, $id, $commit, $error, $user );
- return $status->isGood();
- }
-
- /**
- * Back-end article deletion
- * Deletes the article with database consistency, writes logs, purges caches
- *
- * @since 1.19
- *
- * @param string $reason Delete reason for deletion log
- * @param bool $suppress Suppress all revisions and log the deletion in
- * the suppression log instead of the deletion log
- * @param int $id Article ID
- * @param bool $commit Defaults to true, triggers transaction end
- * @param array &$error Array of errors to append to
- * @param User $user The deleting user
- * @return Status Status object; if successful, $status->value is the log_id of the
- * deletion log entry. If the page couldn't be deleted because it wasn't
- * found, $status is a non-fatal 'cannotdelete' error
- */
- public function doDeleteArticleReal(
- $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
- ) {
- global $wgUser, $wgContentHandlerUseDB;
-
- wfDebug( __METHOD__ . "\n" );
-
- $status = Status::newGood();
-
- if ( $this->mTitle->getDBkey() === '' ) {
- $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
- return $status;
- }
-
- $user = is_null( $user ) ? $wgUser : $user;
- if ( ! wfRunHooks( 'ArticleDelete', array( &$this, &$user, &$reason, &$error, &$status ) ) ) {
- if ( $status->isOK() ) {
- // Hook aborted but didn't set a fatal status
- $status->fatal( 'delete-hook-aborted' );
- }
- return $status;
- }
-
- $dbw = wfGetDB( DB_MASTER );
- $dbw->begin( __METHOD__ );
-
- if ( $id == 0 ) {
- $this->loadPageData( 'forupdate' );
- $id = $this->getID();
- if ( $id == 0 ) {
- $dbw->rollback( __METHOD__ );
- $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
- return $status;
- }
- }
-
- // we need to remember the old content so we can use it to generate all deletion updates.
- $content = $this->getContent( Revision::RAW );
-
- // Bitfields to further suppress the content
- if ( $suppress ) {
- $bitfield = 0;
- // This should be 15...
- $bitfield |= Revision::DELETED_TEXT;
- $bitfield |= Revision::DELETED_COMMENT;
- $bitfield |= Revision::DELETED_USER;
- $bitfield |= Revision::DELETED_RESTRICTED;
- } else {
- $bitfield = 'rev_deleted';
- }
-
- // For now, shunt the revision data into the archive table.
- // Text is *not* removed from the text table; bulk storage
- // is left intact to avoid breaking block-compression or
- // immutable storage schemes.
- //
- // For backwards compatibility, note that some older archive
- // table entries will have ar_text and ar_flags fields still.
- //
- // In the future, we may keep revisions and mark them with
- // the rev_deleted field, which is reserved for this purpose.
-
- $row = array(
- 'ar_namespace' => 'page_namespace',
- 'ar_title' => 'page_title',
- 'ar_comment' => 'rev_comment',
- 'ar_user' => 'rev_user',
- 'ar_user_text' => 'rev_user_text',
- 'ar_timestamp' => 'rev_timestamp',
- 'ar_minor_edit' => 'rev_minor_edit',
- 'ar_rev_id' => 'rev_id',
- 'ar_parent_id' => 'rev_parent_id',
- 'ar_text_id' => 'rev_text_id',
- 'ar_text' => '\'\'', // Be explicit to appease
- 'ar_flags' => '\'\'', // MySQL's "strict mode"...
- 'ar_len' => 'rev_len',
- 'ar_page_id' => 'page_id',
- 'ar_deleted' => $bitfield,
- 'ar_sha1' => 'rev_sha1',
- );
-
- if ( $wgContentHandlerUseDB ) {
- $row['ar_content_model'] = 'rev_content_model';
- $row['ar_content_format'] = 'rev_content_format';
- }
-
- $dbw->insertSelect( 'archive', array( 'page', 'revision' ),
- $row,
- array(
- 'page_id' => $id,
- 'page_id = rev_page'
- ), __METHOD__
- );
-
- // Now that it's safely backed up, delete it
- $dbw->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
- $ok = ( $dbw->affectedRows() > 0 ); // $id could be laggy
-
- if ( !$ok ) {
- $dbw->rollback( __METHOD__ );
- $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
- return $status;
- }
-
- if ( !$dbw->cascadingDeletes() ) {
- $dbw->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
- }
-
- // Clone the title, so we have the information we need when we log
- $logTitle = clone $this->mTitle;
-
- $this->doDeleteUpdates( $id, $content );
-
- // Log the deletion, if the page was suppressed, log it at Oversight instead
- $logtype = $suppress ? 'suppress' : 'delete';
-
- $logEntry = new ManualLogEntry( $logtype, 'delete' );
- $logEntry->setPerformer( $user );
- $logEntry->setTarget( $logTitle );
- $logEntry->setComment( $reason );
- $logid = $logEntry->insert();
-
- $dbw->onTransactionPreCommitOrIdle( function() use ( $dbw, $logEntry, $logid ) {
- // Bug 56776: avoid deadlocks (especially from FileDeleteForm)
- $logEntry->publish( $logid );
- } );
-
- if ( $commit ) {
- $dbw->commit( __METHOD__ );
- }
-
- wfRunHooks( 'ArticleDeleteComplete', array( &$this, &$user, $reason, $id, $content, $logEntry ) );
- $status->value = $logid;
- return $status;
- }
-
- /**
- * Do some database updates after deletion
- *
- * @param int $id page_id value of the page being deleted
- * @param Content $content Optional page content to be used when determining
- * the required updates. This may be needed because $this->getContent()
- * may already return null when the page proper was deleted.
- */
- public function doDeleteUpdates( $id, Content $content = null ) {
- // update site status
- DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, - (int)$this->isCountable(), -1 ) );
-
- // remove secondary indexes, etc
- $updates = $this->getDeletionUpdates( $content );
- DataUpdate::runUpdates( $updates );
-
- // Reparse any pages transcluding this page
- LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'templatelinks' );
-
- // Reparse any pages including this image
- if ( $this->mTitle->getNamespace() == NS_FILE ) {
- LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'imagelinks' );
- }
-
- // Clear caches
- WikiPage::onArticleDelete( $this->mTitle );
-
- // Reset this object and the Title object
- $this->loadFromRow( false, self::READ_LATEST );
-
- // Search engine
- DeferredUpdates::addUpdate( new SearchUpdate( $id, $this->mTitle ) );
- }
-
- /**
- * Roll back the most recent consecutive set of edits to a page
- * from the same user; fails if there are no eligible edits to
- * roll back to, e.g. user is the sole contributor. This function
- * performs permissions checks on $user, then calls commitRollback()
- * to do the dirty work
- *
- * @todo Separate the business/permission stuff out from backend code
- *
- * @param string $fromP Name of the user whose edits to rollback.
- * @param string $summary Custom summary. Set to default summary if empty.
- * @param string $token Rollback token.
- * @param bool $bot If true, mark all reverted edits as bot.
- *
- * @param array $resultDetails contains result-specific array of additional values
- * 'alreadyrolled' : 'current' (rev)
- * success : 'summary' (str), 'current' (rev), 'target' (rev)
- *
- * @param User $user The user performing the rollback
- * @return array Array of errors, each error formatted as
- * array(messagekey, param1, param2, ...).
- * On success, the array is empty. This array can also be passed to
- * OutputPage::showPermissionsErrorPage().
- */
- public function doRollback(
- $fromP, $summary, $token, $bot, &$resultDetails, User $user
- ) {
- $resultDetails = null;
-
- // Check permissions
- $editErrors = $this->mTitle->getUserPermissionsErrors( 'edit', $user );
- $rollbackErrors = $this->mTitle->getUserPermissionsErrors( 'rollback', $user );
- $errors = array_merge( $editErrors, wfArrayDiff2( $rollbackErrors, $editErrors ) );
-
- if ( !$user->matchEditToken( $token, array( $this->mTitle->getPrefixedText(), $fromP ) ) ) {
- $errors[] = array( 'sessionfailure' );
- }
-
- if ( $user->pingLimiter( 'rollback' ) || $user->pingLimiter() ) {
- $errors[] = array( 'actionthrottledtext' );
- }
-
- // If there were errors, bail out now
- if ( !empty( $errors ) ) {
- return $errors;
- }
-
- return $this->commitRollback( $fromP, $summary, $bot, $resultDetails, $user );
- }
-
- /**
- * Backend implementation of doRollback(), please refer there for parameter
- * and return value documentation
- *
- * NOTE: This function does NOT check ANY permissions, it just commits the
- * rollback to the DB. Therefore, you should only call this function direct-
- * ly if you want to use custom permissions checks. If you don't, use
- * doRollback() instead.
- * @param string $fromP Name of the user whose edits to rollback.
- * @param string $summary Custom summary. Set to default summary if empty.
- * @param bool $bot If true, mark all reverted edits as bot.
- *
- * @param array $resultDetails Contains result-specific array of additional values
- * @param User $guser The user performing the rollback
- * @return array
- */
- public function commitRollback( $fromP, $summary, $bot, &$resultDetails, User $guser ) {
- global $wgUseRCPatrol, $wgContLang;
-
- $dbw = wfGetDB( DB_MASTER );
-
- if ( wfReadOnly() ) {
- return array( array( 'readonlytext' ) );
- }
-
- // Get the last editor
- $current = $this->getRevision();
- if ( is_null( $current ) ) {
- // Something wrong... no page?
- return array( array( 'notanarticle' ) );
- }
-
- $from = str_replace( '_', ' ', $fromP );
- // User name given should match up with the top revision.
- // If the user was deleted then $from should be empty.
- if ( $from != $current->getUserText() ) {
- $resultDetails = array( 'current' => $current );
- return array( array( 'alreadyrolled',
- htmlspecialchars( $this->mTitle->getPrefixedText() ),
- htmlspecialchars( $fromP ),
- htmlspecialchars( $current->getUserText() )
- ) );
- }
-
- // Get the last edit not by this guy...
- // Note: these may not be public values
- $user = intval( $current->getRawUser() );
- $user_text = $dbw->addQuotes( $current->getRawUserText() );
- $s = $dbw->selectRow( 'revision',
- array( 'rev_id', 'rev_timestamp', 'rev_deleted' ),
- array( 'rev_page' => $current->getPage(),
- "rev_user != {$user} OR rev_user_text != {$user_text}"
- ), __METHOD__,
- array( 'USE INDEX' => 'page_timestamp',
- 'ORDER BY' => 'rev_timestamp DESC' )
- );
- if ( $s === false ) {
- // No one else ever edited this page
- return array( array( 'cantrollback' ) );
- } elseif ( $s->rev_deleted & Revision::DELETED_TEXT
- || $s->rev_deleted & Revision::DELETED_USER
- ) {
- // Only admins can see this text
- return array( array( 'notvisiblerev' ) );
- }
-
- // Set patrolling and bot flag on the edits, which gets rollbacked.
- // This is done before the rollback edit to have patrolling also on failure (bug 62157).
- $set = array();
- if ( $bot && $guser->isAllowed( 'markbotedits' ) ) {
- // Mark all reverted edits as bot
- $set['rc_bot'] = 1;
- }
-
- if ( $wgUseRCPatrol ) {
- // Mark all reverted edits as patrolled
- $set['rc_patrolled'] = 1;
- }
-
- if ( count( $set ) ) {
- $dbw->update( 'recentchanges', $set,
- array( /* WHERE */
- 'rc_cur_id' => $current->getPage(),
- 'rc_user_text' => $current->getUserText(),
- 'rc_timestamp > ' . $dbw->addQuotes( $s->rev_timestamp ),
- ), __METHOD__
- );
- }
-
- // Generate the edit summary if necessary
- $target = Revision::newFromId( $s->rev_id );
- if ( empty( $summary ) ) {
- if ( $from == '' ) { // no public user name
- $summary = wfMessage( 'revertpage-nouser' );
- } else {
- $summary = wfMessage( 'revertpage' );
- }
- }
-
- // Allow the custom summary to use the same args as the default message
- $args = array(
- $target->getUserText(), $from, $s->rev_id,
- $wgContLang->timeanddate( wfTimestamp( TS_MW, $s->rev_timestamp ) ),
- $current->getId(), $wgContLang->timeanddate( $current->getTimestamp() )
- );
- if ( $summary instanceof Message ) {
- $summary = $summary->params( $args )->inContentLanguage()->text();
- } else {
- $summary = wfMsgReplaceArgs( $summary, $args );
- }
-
- // Trim spaces on user supplied text
- $summary = trim( $summary );
-
- // Truncate for whole multibyte characters.
- $summary = $wgContLang->truncate( $summary, 255 );
-
- // Save
- $flags = EDIT_UPDATE;
-
- if ( $guser->isAllowed( 'minoredit' ) ) {
- $flags |= EDIT_MINOR;
- }
-
- if ( $bot && ( $guser->isAllowedAny( 'markbotedits', 'bot' ) ) ) {
- $flags |= EDIT_FORCE_BOT;
- }
-
- // Actually store the edit
- $status = $this->doEditContent(
- $target->getContent(),
- $summary,
- $flags,
- $target->getId(),
- $guser
- );
-
- if ( !$status->isOK() ) {
- return $status->getErrorsArray();
- }
-
- // raise error, when the edit is an edit without a new version
- if ( empty( $status->value['revision'] ) ) {
- $resultDetails = array( 'current' => $current );
- return array( array( 'alreadyrolled',
- htmlspecialchars( $this->mTitle->getPrefixedText() ),
- htmlspecialchars( $fromP ),
- htmlspecialchars( $current->getUserText() )
- ) );
- }
-
- $revId = $status->value['revision']->getId();
-
- wfRunHooks( 'ArticleRollbackComplete', array( $this, $guser, $target, $current ) );
-
- $resultDetails = array(
- 'summary' => $summary,
- 'current' => $current,
- 'target' => $target,
- 'newid' => $revId
- );
-
- return array();
- }
-
- /**
- * The onArticle*() functions are supposed to be a kind of hooks
- * which should be called whenever any of the specified actions
- * are done.
- *
- * This is a good place to put code to clear caches, for instance.
- *
- * This is called on page move and undelete, as well as edit
- *
- * @param Title $title
- */
- public static function onArticleCreate( $title ) {
- // Update existence markers on article/talk tabs...
- if ( $title->isTalkPage() ) {
- $other = $title->getSubjectPage();
- } else {
- $other = $title->getTalkPage();
- }
-
- $other->invalidateCache();
- $other->purgeSquid();
-
- $title->touchLinks();
- $title->purgeSquid();
- $title->deleteTitleProtection();
- }
-
- /**
- * Clears caches when article is deleted
- *
- * @param Title $title
- */
- public static function onArticleDelete( $title ) {
- // Update existence markers on article/talk tabs...
- if ( $title->isTalkPage() ) {
- $other = $title->getSubjectPage();
- } else {
- $other = $title->getTalkPage();
- }
-
- $other->invalidateCache();
- $other->purgeSquid();
-
- $title->touchLinks();
- $title->purgeSquid();
-
- // File cache
- HTMLFileCache::clearFileCache( $title );
- InfoAction::invalidateCache( $title );
-
- // Messages
- if ( $title->getNamespace() == NS_MEDIAWIKI ) {
- MessageCache::singleton()->replace( $title->getDBkey(), false );
- }
-
- // Images
- if ( $title->getNamespace() == NS_FILE ) {
- $update = new HTMLCacheUpdate( $title, 'imagelinks' );
- $update->doUpdate();
- }
-
- // User talk pages
- if ( $title->getNamespace() == NS_USER_TALK ) {
- $user = User::newFromName( $title->getText(), false );
- if ( $user ) {
- $user->setNewtalk( false );
- }
- }
-
- // Image redirects
- RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $title );
- }
-
- /**
- * Purge caches on page update etc
- *
- * @param Title $title
- * @todo Verify that $title is always a Title object (and never false or
- * null), add Title hint to parameter $title.
- */
- public static function onArticleEdit( $title ) {
- // Invalidate caches of articles which include this page
- DeferredUpdates::addHTMLCacheUpdate( $title, 'templatelinks' );
-
- // Invalidate the caches of all pages which redirect here
- DeferredUpdates::addHTMLCacheUpdate( $title, 'redirect' );
-
- // Purge squid for this page only
- $title->purgeSquid();
-
- // Clear file cache for this page only
- HTMLFileCache::clearFileCache( $title );
- InfoAction::invalidateCache( $title );
- }
-
- /**#@-*/
-
- /**
- * Returns a list of categories this page is a member of.
- * Results will include hidden categories
- *
- * @return TitleArray
- */
- public function getCategories() {
- $id = $this->getId();
- if ( $id == 0 ) {
- return TitleArray::newFromResult( new FakeResultWrapper( array() ) );
- }
-
- $dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( 'categorylinks',
- array( 'cl_to AS page_title, ' . NS_CATEGORY . ' AS page_namespace' ),
- // Have to do that since DatabaseBase::fieldNamesWithAlias treats numeric indexes
- // as not being aliases, and NS_CATEGORY is numeric
- array( 'cl_from' => $id ),
- __METHOD__ );
-
- return TitleArray::newFromResult( $res );
- }
-
- /**
- * Returns a list of hidden categories this page is a member of.
- * Uses the page_props and categorylinks tables.
- *
- * @return array Array of Title objects
- */
- public function getHiddenCategories() {
- $result = array();
- $id = $this->getId();
-
- if ( $id == 0 ) {
- return array();
- }
-
- $dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( array( 'categorylinks', 'page_props', 'page' ),
- array( 'cl_to' ),
- array( 'cl_from' => $id, 'pp_page=page_id', 'pp_propname' => 'hiddencat',
- 'page_namespace' => NS_CATEGORY, 'page_title=cl_to' ),
- __METHOD__ );
-
- if ( $res !== false ) {
- foreach ( $res as $row ) {
- $result[] = Title::makeTitle( NS_CATEGORY, $row->cl_to );
- }
- }
-
- return $result;
- }
-
- /**
- * Return an applicable autosummary if one exists for the given edit.
- * @param string|null $oldtext The previous text of the page.
- * @param string|null $newtext The submitted text of the page.
- * @param int $flags Bitmask: a bitmask of flags submitted for the edit.
- * @return string An appropriate autosummary, or an empty string.
- *
- * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
- */
- public static function getAutosummary( $oldtext, $newtext, $flags ) {
- // NOTE: stub for backwards-compatibility. assumes the given text is
- // wikitext. will break horribly if it isn't.
-
- ContentHandler::deprecated( __METHOD__, '1.21' );
-
- $handler = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT );
- $oldContent = is_null( $oldtext ) ? null : $handler->unserializeContent( $oldtext );
- $newContent = is_null( $newtext ) ? null : $handler->unserializeContent( $newtext );
-
- return $handler->getAutosummary( $oldContent, $newContent, $flags );
- }
-
- /**
- * Auto-generates a deletion reason
- *
- * @param bool &$hasHistory Whether the page has a history
- * @return string|bool String containing deletion reason or empty string, or boolean false
- * if no revision occurred
- */
- public function getAutoDeleteReason( &$hasHistory ) {
- return $this->getContentHandler()->getAutoDeleteReason( $this->getTitle(), $hasHistory );
- }
-
- /**
- * Update all the appropriate counts in the category table, given that
- * we've added the categories $added and deleted the categories $deleted.
- *
- * @param array $added The names of categories that were added
- * @param array $deleted The names of categories that were deleted
- */
- public function updateCategoryCounts( array $added, array $deleted ) {
- $that = $this;
- $method = __METHOD__;
- $dbw = wfGetDB( DB_MASTER );
-
- // Do this at the end of the commit to reduce lock wait timeouts
- $dbw->onTransactionPreCommitOrIdle(
- function() use ( $dbw, $that, $method, $added, $deleted ) {
- $ns = $that->getTitle()->getNamespace();
-
- $addFields = array( 'cat_pages = cat_pages + 1' );
- $removeFields = array( 'cat_pages = cat_pages - 1' );
- if ( $ns == NS_CATEGORY ) {
- $addFields[] = 'cat_subcats = cat_subcats + 1';
- $removeFields[] = 'cat_subcats = cat_subcats - 1';
- } elseif ( $ns == NS_FILE ) {
- $addFields[] = 'cat_files = cat_files + 1';
- $removeFields[] = 'cat_files = cat_files - 1';
- }
-
- if ( count( $added ) ) {
- $insertRows = array();
- foreach ( $added as $cat ) {
- $insertRows[] = array(
- 'cat_title' => $cat,
- 'cat_pages' => 1,
- 'cat_subcats' => ( $ns == NS_CATEGORY ) ? 1 : 0,
- 'cat_files' => ( $ns == NS_FILE ) ? 1 : 0,
- );
- }
- $dbw->upsert(
- 'category',
- $insertRows,
- array( 'cat_title' ),
- $addFields,
- $method
- );
- }
-
- if ( count( $deleted ) ) {
- $dbw->update(
- 'category',
- $removeFields,
- array( 'cat_title' => $deleted ),
- $method
- );
- }
-
- foreach ( $added as $catName ) {
- $cat = Category::newFromName( $catName );
- wfRunHooks( 'CategoryAfterPageAdded', array( $cat, $that ) );
- }
-
- foreach ( $deleted as $catName ) {
- $cat = Category::newFromName( $catName );
- wfRunHooks( 'CategoryAfterPageRemoved', array( $cat, $that ) );
- }
- }
- );
- }
-
- /**
- * Updates cascading protections
- *
- * @param ParserOutput $parserOutput ParserOutput object for the current version
- */
- public function doCascadeProtectionUpdates( ParserOutput $parserOutput ) {
- if ( wfReadOnly() || !$this->mTitle->areRestrictionsCascading() ) {
- return;
- }
-
- // templatelinks or imagelinks tables may have become out of sync,
- // especially if using variable-based transclusions.
- // For paranoia, check if things have changed and if
- // so apply updates to the database. This will ensure
- // that cascaded protections apply as soon as the changes
- // are visible.
-
- // Get templates from templatelinks and images from imagelinks
- $id = $this->getId();
-
- $dbLinks = array();
-
- $dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( array( 'templatelinks' ),
- array( 'tl_namespace', 'tl_title' ),
- array( 'tl_from' => $id ),
- __METHOD__
- );
-
- foreach ( $res as $row ) {
- $dbLinks["{$row->tl_namespace}:{$row->tl_title}"] = true;
- }
-
- $dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( array( 'imagelinks' ),
- array( 'il_to' ),
- array( 'il_from' => $id ),
- __METHOD__
- );
-
- foreach ( $res as $row ) {
- $dbLinks[NS_FILE . ":{$row->il_to}"] = true;
- }
-
- // Get templates and images from parser output.
- $poLinks = array();
- foreach ( $parserOutput->getTemplates() as $ns => $templates ) {
- foreach ( $templates as $dbk => $id ) {
- $poLinks["$ns:$dbk"] = true;
- }
- }
- foreach ( $parserOutput->getImages() as $dbk => $id ) {
- $poLinks[NS_FILE . ":$dbk"] = true;
- }
-
- // Get the diff
- $links_diff = array_diff_key( $poLinks, $dbLinks );
-
- if ( count( $links_diff ) > 0 ) {
- // Whee, link updates time.
- // Note: we are only interested in links here. We don't need to get
- // other DataUpdate items from the parser output.
- $u = new LinksUpdate( $this->mTitle, $parserOutput, false );
- $u->doUpdate();
- }
- }
-
- /**
- * Return a list of templates used by this article.
- * Uses the templatelinks table
- *
- * @deprecated since 1.19; use Title::getTemplateLinksFrom()
- * @return array Array of Title objects
- */
- public function getUsedTemplates() {
- return $this->mTitle->getTemplateLinksFrom();
- }
-
- /**
- * This function is called right before saving the wikitext,
- * so we can do things like signatures and links-in-context.
- *
- * @deprecated since 1.19; use Parser::preSaveTransform() instead
- * @param string $text Article contents
- * @param User $user User doing the edit
- * @param ParserOptions $popts Parser options, default options for
- * the user loaded if null given
- * @return string Article contents with altered wikitext markup (signatures
- * converted, {{subst:}}, templates, etc.)
- */
- public function preSaveTransform( $text, User $user = null, ParserOptions $popts = null ) {
- global $wgParser, $wgUser;
-
- wfDeprecated( __METHOD__, '1.19' );
-
- $user = is_null( $user ) ? $wgUser : $user;
-
- if ( $popts === null ) {
- $popts = ParserOptions::newFromUser( $user );
- }
-
- return $wgParser->preSaveTransform( $text, $this->mTitle, $user, $popts );
- }
-
- /**
- * Check whether the number of revisions of this page surpasses $wgDeleteRevisionsLimit
- *
- * @deprecated since 1.19; use Title::isBigDeletion() instead.
- * @return bool
- */
- public function isBigDeletion() {
- wfDeprecated( __METHOD__, '1.19' );
- return $this->mTitle->isBigDeletion();
- }
-
- /**
- * Get the approximate revision count of this page.
- *
- * @deprecated since 1.19; use Title::estimateRevisionCount() instead.
- * @return int
- */
- public function estimateRevisionCount() {
- wfDeprecated( __METHOD__, '1.19' );
- return $this->mTitle->estimateRevisionCount();
- }
-
- /**
- * Update the article's restriction field, and leave a log entry.
- *
- * @deprecated since 1.19
- * @param array $limit Set of restriction keys
- * @param string $reason
- * @param int &$cascade Set to false if cascading protection isn't allowed.
- * @param array $expiry Per restriction type expiration
- * @param User $user The user updating the restrictions
- * @return bool true on success
- */
- public function updateRestrictions(
- $limit = array(), $reason = '', &$cascade = 0, $expiry = array(), User $user = null
- ) {
- global $wgUser;
-
- $user = is_null( $user ) ? $wgUser : $user;
-
- return $this->doUpdateRestrictions( $limit, $expiry, $cascade, $reason, $user )->isOK();
- }
-
- /**
- * Returns a list of updates to be performed when this page is deleted. The
- * updates should remove any information about this page from secondary data
- * stores such as links tables.
- *
- * @param Content|null $content Optional Content object for determining the
- * necessary updates.
- * @return array An array of DataUpdates objects
- */
- public function getDeletionUpdates( Content $content = null ) {
- if ( !$content ) {
- // load content object, which may be used to determine the necessary updates
- // XXX: the content may not be needed to determine the updates, then this would be overhead.
- $content = $this->getContent( Revision::RAW );
- }
-
- if ( !$content ) {
- $updates = array();
- } else {
- $updates = $content->getDeletionUpdates( $this );
- }
-
- wfRunHooks( 'WikiPageDeletionUpdates', array( $this, $content, &$updates ) );
- return $updates;
- }
-
-}
-
-class PoolWorkArticleView extends PoolCounterWork {
- /** @var Page */
- private $page;
-
- /** @var string */
- private $cacheKey;
-
- /** @var int */
- private $revid;
-
- /** @var ParserOptions */
- private $parserOptions;
-
- /** @var Content|null */
- private $content = null;
-
- /** @var ParserOutput|bool */
- private $parserOutput = false;
-
- /** @var bool */
- private $isDirty = false;
-
- /** @var Status|bool */
- private $error = false;
-
- /**
- * @param Page $page
- * @param int $revid ID of the revision being parsed.
- * @param bool $useParserCache Whether to use the parser cache.
- * @param ParserOptions $parserOptions ParserOptions to use for the parse
- * operation.
- * @param Content|string $content Content to parse or null to load it; may
- * also be given as a wikitext string, for BC.
- */
- public function __construct( Page $page, ParserOptions $parserOptions,
- $revid, $useParserCache, $content = null
- ) {
- if ( is_string( $content ) ) { // BC: old style call
- $modelId = $page->getRevision()->getContentModel();
- $format = $page->getRevision()->getContentFormat();
- $content = ContentHandler::makeContent( $content, $page->getTitle(), $modelId, $format );
- }
-
- $this->page = $page;
- $this->revid = $revid;
- $this->cacheable = $useParserCache;
- $this->parserOptions = $parserOptions;
- $this->content = $content;
- $this->cacheKey = ParserCache::singleton()->getKey( $page, $parserOptions );
- parent::__construct( 'ArticleView', $this->cacheKey . ':revid:' . $revid );
- }
-
- /**
- * Get the ParserOutput from this object, or false in case of failure
- *
- * @return ParserOutput
- */
- public function getParserOutput() {
- return $this->parserOutput;
- }
-
- /**
- * Get whether the ParserOutput is a dirty one (i.e. expired)
- *
- * @return bool
- */
- public function getIsDirty() {
- return $this->isDirty;
- }
-
- /**
- * Get a Status object in case of error or false otherwise
- *
- * @return Status|bool
- */
- public function getError() {
- return $this->error;
- }
-
- /**
- * @return bool
- */
- public function doWork() {
- global $wgUseFileCache;
-
- // @todo several of the methods called on $this->page are not declared in Page, but present
- // in WikiPage and delegated by Article.
-
- $isCurrent = $this->revid === $this->page->getLatest();
-
- if ( $this->content !== null ) {
- $content = $this->content;
- } elseif ( $isCurrent ) {
- // XXX: why use RAW audience here, and PUBLIC (default) below?
- $content = $this->page->getContent( Revision::RAW );
- } else {
- $rev = Revision::newFromTitle( $this->page->getTitle(), $this->revid );
-
- if ( $rev === null ) {
- $content = null;
- } else {
- // XXX: why use PUBLIC audience here (default), and RAW above?
- $content = $rev->getContent();
- }
- }
-
- if ( $content === null ) {
- return false;
- }
-
- // Reduce effects of race conditions for slow parses (bug 46014)
- $cacheTime = wfTimestampNow();
-
- $time = - microtime( true );
- $this->parserOutput = $content->getParserOutput(
- $this->page->getTitle(),
- $this->revid,
- $this->parserOptions
- );
- $time += microtime( true );
-
- // Timing hack
- if ( $time > 3 ) {
- wfDebugLog( 'slow-parse', sprintf( "%-5.2f %s", $time,
- $this->page->getTitle()->getPrefixedDBkey() ) );
- }
-
- if ( $this->cacheable && $this->parserOutput->isCacheable() && $isCurrent ) {
- ParserCache::singleton()->save(
- $this->parserOutput, $this->page, $this->parserOptions, $cacheTime, $this->revid );
- }
-
- // Make sure file cache is not used on uncacheable content.
- // Output that has magic words in it can still use the parser cache
- // (if enabled), though it will generally expire sooner.
- if ( !$this->parserOutput->isCacheable() || $this->parserOutput->containsOldMagic() ) {
- $wgUseFileCache = false;
- }
-
- if ( $isCurrent ) {
- $this->page->doCascadeProtectionUpdates( $this->parserOutput );
- }
-
- return true;
- }
-
- /**
- * @return bool
- */
- public function getCachedWork() {
- $this->parserOutput = ParserCache::singleton()->get( $this->page, $this->parserOptions );
-
- if ( $this->parserOutput === false ) {
- wfDebug( __METHOD__ . ": parser cache miss\n" );
- return false;
- } else {
- wfDebug( __METHOD__ . ": parser cache hit\n" );
- return true;
- }
- }
-
- /**
- * @return bool
- */
- public function fallback() {
- $this->parserOutput = ParserCache::singleton()->getDirty( $this->page, $this->parserOptions );
-
- if ( $this->parserOutput === false ) {
- wfDebugLog( 'dirty', 'dirty missing' );
- wfDebug( __METHOD__ . ": no dirty cache\n" );
- return false;
- } else {
- wfDebug( __METHOD__ . ": sending dirty output\n" );
- wfDebugLog( 'dirty', "dirty output {$this->cacheKey}" );
- $this->isDirty = true;
- return true;
- }
- }
-
- /**
- * @param Status $status
- * @return bool
- */
- public function error( $status ) {
- $this->error = $status;
- return false;
- }
-}
return $this->getContext()->getLanguage();
}
- /**
- * Shortcut to get the user Language being used for this instance
- *
- * @deprecated since 1.19 Use getLanguage instead
- * @return Language
- */
- final public function getLang() {
- wfDeprecated( __METHOD__, '1.19' );
- return $this->getLanguage();
- }
-
/**
* Shortcut to get the Title object from the page
* @return Title
// if they didn't want any output except (probably) the parse tree,
// then don't bother actually fully expanding it
if ( $prop || $params['prop'] === null ) {
+ $wgParser->startExternalParse( $title_obj, $options, OT_PREPROCESS );
$frame = $wgParser->getPreprocessor()->newFrame();
$wikitext = $wgParser->preprocess( $params['text'], $title_obj, $options, null, $frame );
if ( $params['prop'] === null ) {
$popts->enableLimitReport( !$params['disablepp'] );
$popts->setIsPreview( $params['preview'] || $params['sectionpreview'] );
$popts->setIsSectionPreview( $params['sectionpreview'] );
+ $popts->setEditSection( !$params['disableeditsection'] );
wfProfileOut( __METHOD__ );
'uselang' => null,
'section' => null,
'disablepp' => false,
+ 'disableeditsection' => false,
'generatexml' => false,
'preview' => false,
'sectionpreview' => false,
'uselang' => 'Which language to parse the request in',
'section' => 'Only retrieve the content of this section number',
'disablepp' => 'Disable the PP Report from the parser output',
+ 'disableeditsection' => 'Disable edit section links from the parser output',
'generatexml' => "Generate XML parse tree (requires contentmodel=$wikitext)",
'preview' => 'Parse in preview mode',
'sectionpreview' => 'Parse in section preview mode (enables preview mode too)',
$langNames = Language::fetchLanguageNames( $langCode );
$getPrefixes = Interwiki::getAllPrefixes( $local );
+ $extraLangPrefixes = $this->getConfig()->get( 'ExtraInterlanguageLinkPrefixes' );
+ $localInterwikis = $this->getConfig()->get( 'LocalInterwikis' );
$data = array();
foreach ( $getPrefixes as $row ) {
if ( $row['iw_trans'] == '1' ) {
$val['trans'] = '';
}
+
if ( isset( $langNames[$prefix] ) ) {
$val['language'] = $langNames[$prefix];
}
+ if ( in_array( $prefix, $localInterwikis ) ) {
+ $val['localinterwiki'] = '';
+ }
+ if ( in_array( $prefix, $extraLangPrefixes ) ) {
+ $val['extralanglink'] = '';
+
+ $linktext = wfMessage( "interlanguage-link-$prefix" );
+ if ( !$linktext->isDisabled() ) {
+ $val['linktext'] = $linktext->text();
+ }
+
+ $sitename = wfMessage( "interlanguage-link-sitename-$prefix" );
+ if ( !$sitename->isDisabled() ) {
+ $val['sitename'] = $sitename->text();
+ }
+ }
+
$val['url'] = wfExpandUrl( $row['iw_url'], PROTO_CURRENT );
if (substr( $row['iw_url'], 0, 2) == '//') {
$val['protorel'] = '';
if ( isset( $ext['name'] ) ) {
$ret['name'] = $ext['name'];
}
+ if ( isset( $ext['namemsg'] ) ) {
+ $ret['namemsg'] = $ext['namemsg'];
+ }
if ( isset( $ext['description'] ) ) {
$ret['description'] = $ext['description'];
}
}
public function getCacheMode( $params ) {
+ // Messages for $wgExtraInterlanguageLinkPrefixes depend on user language
+ if (
+ count( $this->getConfig()->get( 'ExtraInterlanguageLinkPrefixes' ) ) &&
+ !is_null( $params['prop'] ) &&
+ in_array( 'interwikimap', $params['prop'] )
+ ) {
+ return 'anon-public-user-private';
+ }
+
return 'public';
}
$wgParser->firstCallInit();
# Clone it and store it
$class = $wgParserConf['class'];
- if ( $class == 'Parser_DiffTest' ) {
+ if ( $class == 'ParserDiffTest' ) {
# Uncloneable
$this->mParser = new $class( $wgParserConf );
} else {
*/
protected function getWithPrefix( $prefix, $name ) {
$var = $prefix . $name;
- if ( !isset( $GLOBALS[ $var ] ) ) {
+ if ( !array_key_exists( $var, $GLOBALS ) ) {
throw new ConfigException( __METHOD__ . ": undefined variable: '$var'" );
}
return $GLOBALS[ $var ];
*
* @see Content::replaceSection
*/
- public function replaceSection( $section, Content $with, $sectionTitle = '' ) {
+ public function replaceSection( $sectionId, Content $with, $sectionTitle = '' ) {
return null;
}
*
* @since 1.21
*
- * @param string $sectionId The section's ID, given as a numeric string.
- * The ID "0" retrieves the section before the first heading, "1" the
- * text between the first heading (included) and the second heading
- * (excluded), etc.
+ * @param string|number $sectionId Section identifier as a number or string
+ * (e.g. 0, 1 or 'T-1'). The ID "0" retrieves the section before the first heading, "1" the
+ * text between the first heading (included) and the second heading (excluded), etc.
*
* @return Content|bool|null The section, or false if no such section
* exist, or null if sections are not supported.
*
* @since 1.21
*
- * @param mixed $section Null/false or a section number (0, 1, 2, T1, T2...), or "new"
+ * @param string|number|null|bool $sectionId Section identifier as a number or string
+ * (e.g. 0, 1 or 'T-1'), null/false or an empty string for the whole page
+ * or 'new' for a new section.
* @param Content $with New content of the section
* @param string $sectionTitle New section's subject, only if $section is 'new'
*
* @return string|null Complete article text, or null if error
*/
- public function replaceSection( $section, Content $with, $sectionTitle = '' );
+ public function replaceSection( $sectionId, Content $with, $sectionTitle = '' );
/**
* Returns a Content object with pre-save transformations applied (or this
}
/**
- * @param string $section
+ * @param string|number $sectionId
*
* @return Content|bool|null
*
* @see Content::getSection()
*/
- public function getSection( $section ) {
+ public function getSection( $sectionId ) {
global $wgParser;
$text = $this->getNativeData();
- $sect = $wgParser->getSection( $text, $section, false );
+ $sect = $wgParser->getSection( $text, $sectionId, false );
if ( $sect === false ) {
return false;
}
/**
- * @param string $section
+ * @param string|number|null|bool $sectionId
* @param Content $with
* @param string $sectionTitle
*
*
* @see Content::replaceSection()
*/
- public function replaceSection( $section, Content $with, $sectionTitle = '' ) {
+ public function replaceSection( $sectionId, Content $with, $sectionTitle = '' ) {
wfProfileIn( __METHOD__ );
$myModelId = $this->getModel();
$oldtext = $this->getNativeData();
$text = $with->getNativeData();
- if ( $section === '' ) {
+ if ( strval( $sectionId ) === '' ) {
wfProfileOut( __METHOD__ );
return $with; # XXX: copy first?
}
- if ( $section == 'new' ) {
+ if ( $sectionId === 'new' ) {
# Inserting a new section
$subject = $sectionTitle ? wfMessage( 'newsectionheaderdefaultlevel' )
->rawParams( $sectionTitle )->inContentLanguage()->text() . "\n\n" : '';
# Replacing an existing section; roll out the big guns
global $wgParser;
- $text = $wgParser->replaceSection( $oldtext, $section, $text );
+ $text = $wgParser->replaceSection( $oldtext, $sectionId, $text );
}
$newContent = new WikitextContent( $text );
return $this->getContext()->getUser();
}
- /**
- * Get the Language object
- *
- * @deprecated since 1.19 Use getLanguage instead
- * @return Language
- */
- public function getLang() {
- wfDeprecated( __METHOD__, '1.19' );
-
- return $this->getLanguage();
- }
-
/**
* Get the Language object
*
}
}
- /**
- * Set the Language object
- *
- * @deprecated since 1.19 Use setLanguage instead
- * @param Language|string $l Language instance or language code
- */
- public function setLang( $l ) {
- wfDeprecated( __METHOD__, '1.19' );
- $this->setLanguage( $l );
- }
-
/**
* Set the Language object
*
}
}
- /**
- * @deprecated since 1.19 Use getLanguage instead
- * @return Language
- */
- public function getLang() {
- wfDeprecated( __METHOD__, '1.19' );
- $this->getLanguage();
- }
-
/**
* Get the Language object
*
*/
public function getUser();
- /**
- * Get the Language object
- *
- * @deprecated since 1.19 Use getLanguage instead
- * @return Language
- */
- public function getLang();
-
/**
* Get the Language object
*
return $code;
}
- /**
- * Set the Language object
- *
- * @deprecated since 1.19 Use setLanguage instead
- * @param Language|string $l Language instance or language code
- */
- public function setLang( $l ) {
- wfDeprecated( __METHOD__, '1.19' );
- $this->setLanguage( $l );
- }
-
/**
* Set the Language object
*
}
}
- /**
- * @deprecated since 1.19 Use getLanguage instead
- * @return Language
- */
- public function getLang() {
- wfDeprecated( __METHOD__, '1.19' );
-
- return $this->getLanguage();
- }
-
/**
* Get the Language object.
* Initialization of user or request objects can depend on this.
* Clone the table structure
*/
public function cloneTableStructure() {
+ global $wgSharedTables, $wgSharedDB;
foreach ( $this->tablesToClone as $tbl ) {
+ if ( $wgSharedDB && in_array( $tbl, $wgSharedTables, true ) ) {
+ // Shared tables don't work properly when cloning due to
+ // how prefixes are handled (bug 65654)
+ throw new MWException( "Cannot clone shared table $tbl." );
+ }
# Clean up from previous aborted run. So that table escaping
# works correctly across DB engines, we need to change the pre-
# fix back and forth so tableName() works right.
* @return string
*/
protected function escapeLikeInternal( $s ) {
- $s = str_replace( '\\', '\\\\', $s );
- $s = $this->strencode( $s );
- $s = str_replace( array( '%', '_' ), array( '\%', '\_' ), $s );
-
- return $s;
+ return addcslashes( $s, '\%_' );
}
/**
}
}
- return " LIKE '" . $s . "' ";
+ return " LIKE {$this->addQuotes( $s )} ";
}
/**
} else {
$mysqli->options( MYSQLI_SET_CHARSET_NAME, 'binary' );
}
+ $mysqli->options( MYSQLI_OPT_CONNECT_TIMEOUT, 3 );
- $numAttempts = 2;
- for ( $i = 0; $i < $numAttempts; $i++ ) {
- if ( $i > 1 ) {
- usleep( 1000 );
- }
- if ( $mysqli->real_connect( $realServer, $this->mUser,
- $this->mPassword, $this->mDBname, $port, null, $connFlags )
- ) {
- return $mysqli;
- }
+ if ( $mysqli->real_connect( $realServer, $this->mUser,
+ $this->mPassword, $this->mDBname, $port, null, $connFlags )
+ ) {
+ return $mysqli;
}
return false;
wfProfileIn( __METHOD__ );
$page = WikiPage::newFromId( $this->id, WikiPage::READ_LATEST );
- $indexTitle = $this->indexTitle();
foreach ( SearchEngine::getSearchTypes() as $type ) {
$search = SearchEngine::create( $type );
+ $indexTitle = $this->indexTitle( $search );
if ( !$search->supports( 'search-update' ) ) {
continue;
}
*
* @return string A stripped-down title string ready for the search index
*/
- private function indexTitle() {
+ private function indexTitle( SearchEngine $search ) {
global $wgContLang;
$ns = $this->title->getNamespace();
$title = $this->title->getText();
- $lc = SearchEngine::legalSearchChars() . '&#;';
+ $lc = $search->legalSearchChars() . '&#;';
$t = $wgContLang->normalizeForSearch( $title );
$t = preg_replace( "/[^{$lc}]+/", ' ', $t );
$t = $wgContLang->lc( $t );
// NOTE: only needed for B/C: custom rendering of JS/CSS via hook
if ( $this->mNewPage->isCssJsSubpage() || $this->mNewPage->isCssOrJsPage() ) {
- // Stolen from Article::view --AG 2007-10-11
+ // This needs to be synchronised with Article::showCssOrJsPage(), which sucks
// Give hooks a chance to customise the output
// @todo standardize this crap into one function
if ( ContentHandler::runLegacyHooks( 'ShowRawCssJs', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
// use the content object's own rendering
$cnt = $this->mNewRev->getContent();
$po = $cnt ? $cnt->getParserOutput( $this->mNewRev->getTitle(), $this->mNewRev->getId() ) : null;
- $txt = $po ? $po->getText() : '';
- $out->addHTML( $txt );
+ if ( $po ) {
+ $out->addParserOutputContent( $po );
+ }
}
} elseif ( !wfRunHooks( 'ArticleContentViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
// Handled by extension
$this->clearCache();
$supportedOps = array( 'create', 'store', 'copy', 'move', 'delete', 'describe', 'null' );
+ // Parallel ops may be disabled in config due to dependencies (e.g. needing popen())
$async = ( $this->parallelize === 'implicit' && count( $ops ) > 1 );
$maxConcurrency = $this->concurrency; // throttle
// or the backend does not support async ops and did it synchronously.
foreach ( $performOpsBatch as $i => $fileOp ) {
if ( !isset( $status->success[$i] ) ) { // didn't already fail in precheck()
- $subStatus = $fileOp->attemptAsync();
+ // Parallel ops may be disabled in config due to missing dependencies,
+ // (e.g. needing popen()). When they are, $performOpsBatch has size 1.
+ $subStatus = ( count( $performOpsBatch ) > 1 )
+ ? $fileOp->attemptAsync()
+ : $fileOp->attempt();
if ( $subStatus->value instanceof FileBackendStoreOpHandle ) {
$opHandles[$i] = $subStatus->value; // deferred
} else {
* Add header text, inside the form.
*
* @param string $msg Complete text of message to display
- * @param string $section The section to add the header to
+ * @param string|null $section The section to add the header to
*
* @return HTMLForm $this for chaining calls (since 1.20)
*/
* @since 1.19
*
* @param string $msg Complete text of message to display
- * @param string $section The section to add the header to
+ * @param string|null $section The section to add the header to
*
* @return HTMLForm $this for chaining calls (since 1.20)
*/
* Add footer text, inside the form.
*
* @param string $msg complete text of message to display
- * @param string $section The section to add the footer text to
+ * @param string|null $section The section to add the footer text to
*
* @return HTMLForm $this for chaining calls (since 1.20)
*/
* @since 1.19
*
* @param string $msg Complete text of message to display
- * @param string $section The section to add the footer text to
+ * @param string|null $section The section to add the footer text to
*
* @return HTMLForm $this for chaining calls (since 1.20)
*/
wfBoolToStr( $perm ) . ";\n";
}
}
- if ( $this->groupPermissions['*']['edit'] === false
- && $this->groupPermissions['*']['createaccount'] === false
- && $this->groupPermissions['*']['read'] !== false
+ if ( ( isset( $this->groupPermissions['*']['edit'] ) &&
+ $this->groupPermissions['*']['edit'] === false )
+ && ( isset( $this->groupPermissions['*']['createaccount'] ) &&
+ $this->groupPermissions['*']['createaccount'] === false )
+ && ( isset( $this->groupPermissions['*']['read'] ) &&
+ $this->groupPermissions['*']['read'] !== false )
) {
$noFollow = "\n# Set \$wgNoFollowLinks to true if you open up your wiki to editing by\n"
. "# the general public and wish to apply nofollow to external links as a\n"
* @return string
*/
public function getCSS() {
+ // Horrible, horrible hack: the installer is currently hardcoded to use the Vector skin, so load
+ // it here. Include instead of require, as this will work without it, it will just look bad.
+ global $wgResourceModules;
+ global $wgStyleDirectory;
+ include_once "$wgStyleDirectory/Vector/Vector.php";
+
$moduleNames = array(
// See SkinTemplate::setupSkinUserCss
'mediawiki.legacy.shared',
foreach ( $moduleNames as $moduleName ) {
/** @var ResourceLoaderFileModule $module */
$module = $resourceLoader->getModule( $moduleName );
+ // One of the modules will be missing if Vector is unavailable
+ if ( !$module ) {
+ continue;
+ }
// Based on: ResourceLoaderFileModule::getStyles (without the DB query)
$styles = ResourceLoader::makeCombinedStyles( $module->readStyleFiles(
"config-db-charset": "ডেটাবেজের অক্ষর সেট",
"config-db-port": "ডেটাবেজ পোর্ট:",
"config-db-schema": "মিডিয়াউইকির স্কিমা",
+ "config-pg-test-error": "উপাত্তশালা $1-এর সাথে সংযোগ দেয়া সম্ভব হয়নি। কারন:$2",
"config-sqlite-dir": "এসকিউলাইট ডেটা ডিরেক্টরি:",
"config-oracle-def-ts": "পূর্বনির্ধারিত টেবিলস্পেস",
"config-oracle-temp-ts": "সাময়কি টেবিলস্পেস:",
"config-missing-db-name": "আপনাকে অবশ্যই \"ডেটাবেজ নাম\"-এর জন্য একটি মান প্রবেশ করাতে হবে",
"config-missing-db-host": "আপনাকে অবশ্যই \"ডেটাবেজ হোস্ট\"-এর জন্য একটি মান প্রবেশ করাতে হবে",
"config-missing-db-server-oracle": "আপনাকে অবশ্যই \"ডেটাবেজ টিএনএস\"-এর জন্য একটি মান প্রবেশ করাতে হবে",
+ "config-connection-error": "$1।\n\n\nদয়া করে প্রস্তাবকারী, ব্যবহারকারী নাম ও শব্দচাবি দেখুন এবং পুনরায় চেষ্টা করুন।",
"config-mysql-engine": "সংরক্ষণ ইঞ্জিন:",
"config-mysql-innodb": "ইনোডিবি",
"config-mysql-myisam": "মাইআইএসএএম",
"config-license-none": "Keine Lizenzangabe in der Fußzeile",
"config-license-cc-by-sa": "''Creative Commons'' „Namensnennung – Weitergabe unter gleichen Bedingungen“",
"config-license-cc-by": "''Creative Commons'' „Namensnennung“",
- "config-license-cc-by-nc-sa": "''Creative Commons'' „Namensnennung, nicht kommerziell – Weitergabe unter gleichen Bedingungen“",
+ "config-license-cc-by-nc-sa": "''Creative Commons'' „Namensnennung – nicht kommerziell – Weitergabe unter gleichen Bedingungen“",
"config-license-cc-0": "''Creative Commons'' „Zero“ (Gemeinfreiheit)",
"config-license-gfdl": "GNU-Lizenz für freie Dokumentation 1.3 oder höher",
"config-license-pd": "Gemeinfreiheit",
"config-db-port": "Andmebaasi port:",
"config-invalid-db-type": "Vigane andmebaasi tüüp",
"config-site-name": "Viki nimi:",
- "config-site-name-blank": "Sisestage lehekülje nimi.",
+ "config-site-name-blank": "Sisesta võrgukoha nimi.",
"config-project-namespace": "Projekti nimeruum:",
"config-ns-generic": "Projekt",
"config-admin-box": "Administraatorikonto",
"config-help-restart": "你敢欲共你拍的佮保存的資料攏清掉,並且重開始安裝的動作?",
"config-restart": "是,重來",
"config-welcome": "=== 環境檢測 ===\n這馬欲做基本的檢測,看環境是毋是適合裝 MediaWiki。\n若你愛有支援,才裝會起來,請共遮的資訊記起來。",
+ "config-copyright": "=== 版權聲明佮授權條款 ===\n\n$1\n\n本程式是自由軟體;你會當照自由軟體基金會所發表的 GNU 通用公共授權條款規定,共本程式重新發佈抑是修改;無論你是照本授權條款的第二版抑第二版以後的任何版本(你會當家己選) 。\n\n本程式發佈的目的是希望會當提供幫助,但是 <strong>無負任何擔保責任</strong>;抑無表示講對 <strong>販賣性</strong> 抑 <strong>特定用途的適用性</strong> 的情形擔保。詳情請參照 GNU 通用公共授權。\n\n你應該已隨本程式收著 <doclink href=\"Copying\">GNU 通用公共授權條款的副本</doclink>;若無,請寫批通知自由軟體基金會,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或 [http://www.gnu.org/copyleft/gpl.html 線頂看]。",
+ "config-sidebar": "* [www.mediawiki.org/wiki/MediaWiki/zh-hant MediaWiki 頭頁]\n* [www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/zh 使用者指南]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/zh 管理者指南]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hant 四常問題集]\n----\n* <doclink href=Readme>讀我說明</doclink>\n* <doclink href=ReleaseNotes>發行說明</doclink>\n* <doclink href=Copying>版權聲明</doclink>\n* <doclink href=UpgradeDoc>升級</doclink>",
+ "config-env-good": "環境檢查已完成。\n你會當安裝 MediaWiki。",
+ "config-env-bad": "環境檢查已完成。\n你無法度安裝 MediaWiki。",
+ "config-env-php": "PHP $1 已經安裝。",
+ "config-env-php-toolow": "已經安裝 PHP $1。\n但是 MediaWiki 愛 PHP $2 抑較新的版本。",
+ "config-unicode-using-utf8": "用 Brion Vibber 的 utf8_normalize.so 做 Unicode 正規化。",
+ "config-unicode-using-intl": "用 [http://pecl.php.net/intl intl PECL 擴充套件] 做 Unicode 正規化。",
+ "config-unicode-pure-php-warning": "<strong>警告:</strong> 無法度用 [http://pecl.php.net/intl intl PECL 擴充套件] 處理 Unicode 正規化,所以退回用純 PHP 實作的正規化程式,這種方式處理速度較慢。\n\n若你的網站瀏覽人數誠濟,你應該先看 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/zh Unicode 正規化]。",
+ "config-unicode-update-warning": "<strong>警告</strong>:這馬安裝的 Unicode 正規化包裝程式用舊版 [http://site.icu-project.org/ ICU 計劃] 的程式庫。\n若你需要用 Unicode,你應該先進行 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 升級]。",
+ "config-no-db": "揣無適合的資料庫驅動程式!你需要安裝 PHP 資料庫驅動程式。\n這馬支援下跤類型的資料庫: $1 。\n\n若你是家己編譯 PHP,你需要重新設定並且開資料庫客戶端,譬如:用 <code>./configure --with-mysqli</code> 指令參數。\n如你是用 Debian 或 Ubuntu 的套件安裝,你著需要閣另外安裝,例:<code>php5-mysql</code> 套件。",
+ "config-outdated-sqlite": "<strong>警告:</strong>你已經安裝 SQLite $1,毋閣伊的版本比會當裝的版本 $2閣較舊。所以你無法度用 SQLite。",
+ "config-no-fts3": "<strong>警告:</strong> SQLite 佇編譯的時陣無包括 [//sqlite.org/fts3.html FTS3 模組],後台搜揣功能就會無法度用。",
"mainpagetext": "'''MediaWiki已經裝好矣。'''",
"mainpagedocfooter": "請查看[//meta.wikimedia.org/wiki/Help:Contents 用者說明書]的資料通使用wiki 軟體\n\n== 入門 ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings 配置的設定]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki時常問答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki的公布列單]"
}
"config-header-sqlite": "SQLite-instellingen",
"config-header-oracle": "Oracle-instellingen",
"config-header-mssql": "Instellingen voor Microsoft SQL Server",
- "config-invalid-db-type": "Ongeldig databasetype",
+ "config-invalid-db-type": "Ongeldig databasetype.",
"config-missing-db-name": "U moet een waarde opgeven voor \"{{int:config-db-name}}\".",
"config-missing-db-host": "U moet een waarde invoeren voor \"{{int:config-db-host}}\".",
"config-missing-db-server-oracle": "U moet een waarde opgeven voor \"{{int:config-db-host-oracle}}\".",
"config-admin-email": "E-mailadres:",
"config-admin-email-help": "Voer hier een e-mailadres in om e-mail te kunnen ontvangen van andere gebruikers op de wiki, uw wachtwoord opnieuw in te kunnen stellen en op de hoogte te worden gehouden van wijzigingen van pagina's op uw volglijst. U kunt het veld leeg laten.",
"config-admin-error-user": "Interne fout bij het aanmaken van een beheerder met de naam \"<nowiki>$1</nowiki>\".",
- "config-admin-error-password": "Interne fout bij het instellen van een wachtwoord voor de bejeerder \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
- "config-admin-error-bademail": "U hebt een ongeldig e-mailadres opgegeven",
+ "config-admin-error-password": "Interne fout bij het instellen van een wachtwoord voor de beheerder \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
+ "config-admin-error-bademail": "U hebt een ongeldig e-mailadres opgegeven.",
"config-subscribe": "Abonneren op de [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce mailinglijst releaseaankondigen].",
"config-subscribe-help": "Dit is een mailinglijst met een laag volume voor aankondigingen van nieuwe versies, inclusief belangrijke aankondigingen met betrekking tot beveiliging.\nAbonneer uzelf erop en werk uw MediaWiki-installatie bij als er nieuwe versies uitkomen.",
"config-subscribe-noemail": "U hebt geprobeerd zich te abonneren op de mailinglijst voor release-aankondigingen zonder een e-mailadres op te geven.\nGeef een e-mailadres op als u zich wilt abonneren op de mailinglijst.",
"config-email-watchlist": "Volglijstmeldingen inschakelen",
"config-email-watchlist-help": "Gebruikers toestaan meldingen te ontvangen bij wijzigingen van pagina's op hun volglijst, als dit in de voorkeuren is ingesteld.",
"config-email-auth": "E-mailbevestiging inschakelen",
- "config-email-auth-help": "Als deze instelling actief is, moeten gebruikers hun e-mailadres bevestigen via een verwijziging die ze per e-mail wordt toegezonden.\nAlleen bevestigde e-mailadressen kunnen e-mail ontvangen van andere gebruikers of wijzigingsnotificaties ontvangen.\nHet inschakelen van deze instelling wordt '''aangeraden''' voor openbare wiki's vanwege de mogelijkheden voor misbruik van e-mailmogelijkheden.",
+ "config-email-auth-help": "Als deze instelling actief is, moeten gebruikers hun e-mailadres bevestigen via een verwijziging die zij per e-mail wordt toegezonden.\nAlleen bevestigde e-mailadressen kunnen e-mail ontvangen van andere gebruikers of wijzigingsnotificaties ontvangen.\nHet inschakelen van deze instelling wordt '''aangeraden''' voor openbare wiki's vanwege de mogelijkheden voor misbruik van e-mailmogelijkheden.",
"config-email-sender": "E-mailadres voor antwoorden:",
"config-email-sender-help": "Voer het e-mailadres in dat u wilt gebruiken als antwoordadres voor uitgaande e-mail.\nAls een e-mail niet bezorgd kan worden, wordt dat op dit e-mailadres gemeld.\nVeel mailservers vereisen dat tenminste het domein bestaat.",
"config-upload-settings": "Afbeeldingen en bestanden uploaden",
"config-git": "Foi encontrado o software de controle de versão Git: <code>$1</code>.",
"config-git-bad": "Não foi encontrado o software de controle de versão Git.",
"config-imagemagick": "ImageMagick encontrado: <code>$1</code> .\nRedimensionamento de imagem será ativado se você permitir uploads.",
+ "config-gd": "Encontrada biblioteca gráfica GD embutida\nO redimensionamento de imagens será habilitado se você permitir uploads.",
+ "config-no-scaling": "Não foi possível encontrar biblioteca GD ou ImageMagick. \nO redimensionamento de imagens será desabilitado.",
"config-no-uri": "<strong>Erro:</strong> Não foi possível determinar a URI atual. A instalação foi abortada.",
+ "config-no-cli-uri": "<strong>Aviso:</strong> Nenhum <code>--scriptpath</code> foi especificado, usando o padrão: <code>$1</code>.",
"config-using-server": "Utilizando o nome do servidor \"<nowiki>$1</nowiki>\".",
"config-using-uri": "Usando URL do servidor \"<nowiki>$1$2</nowiki>\".",
"config-db-type": "Tipo de base de dados:",
"config-db-install-username": "Digite o nome de usuário que será utilizado para conectar com o banco de dados durante o processo de instalação.\nEste não é a conta de usuário do MediaWiki; este é o nome de usuário para sua base de dados.",
"config-db-install-password": "Digite a senha que será utilizada para conectar com o banco de dados durante o processo de instalação.\nEsta não é a senha de usuário da conta do MediaWiki; esta será a senha para seu banco de dados.",
"config-db-install-help": "Digite o nome de usuário e a senha que serão utilizados para conectar com o banco de dados durante o processo de instalação.",
+ "config-db-wiki-account": "Conta de usuário para operação normal",
+ "config-db-wiki-help": "Digite o nome de usuário e senha que será usada para se conectar ao banco de dados durante a operação normal wiki.\nSe a conta não existir, e a conta de instalação tiver privilégios suficientes, a conta do usuário será criada com os privilégios mínimos necessários para o funcionamento do wiki.",
"config-db-prefix": "Prefixo da tabela de banco de dados:",
"config-db-prefix-help": "Se você precisar compartilhar a base de dados entre várias wikis, ou entre o MediaWiki e uma outra aplicação web, você pode deve escolher adicionar um prefixo ao nome de todas as tabelas para evitar conflitos.\nNão utilize espaços.\n\nEste campo é habitualmente deixado em branco.",
"config-db-charset": "Conjunto de caracteres do banco de dados",
"config-charset-mysql5-binary": "MySQL 4.1/5.0 binary",
"config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+ "config-charset-mysql4": "MySQL 4.0 compatível com versões anteriores UTF-8",
"config-mysql-old": "MySQL $1 ou posterior é necessário. Você tem $2.",
"config-db-port": "Porta da base de dados:",
"config-db-schema": "Esquema para MediaWiki",
"config-sqlite-connection-error": "$1\n\nVerifique o diretório de dados e nome da base de dados abaixo e tente novamente.",
"config-sqlite-readonly": "Não é possível escrever no arquivo <code>$1</code>.",
"config-sqlite-cant-create-db": "Não foi possível criar o arquivo da base de dados <code>$1</code>.",
+ "config-regenerate": "Regenerar arquivo LocalSettings.php →",
+ "config-show-table-status": "Consulta <code>SHOW TABLE STATUS</code> falhou!",
+ "config-unknown-collation": "<strong>Aviso:</strong> O banco de dados está usando agrupamento não reconhecido.",
"config-db-web-account": "Conta da base de dados para acesso web",
"config-db-web-help": "Escolha um nome de usuário e uma senha que o servidor web irá utilizar para se conectar ao servidor da base de dados durante o funcionamento normal da wiki.",
"config-db-web-account-same": "Use a mesma conta usada na instalação",
"config-mbstring": "'''Kritiskt: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] är aktiv!'''\nDetta alternativ orsakar fel och kan korrumpera data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.",
"config-safe-mode": "''' Varning:''' PHP:s [http://www.php.net/features.safe-mode felsäkra läge] är aktivt.\nDet kan orsaka problem, särskilt om du använder filuppladdningar och <code>math</code>-stöd.",
"config-xml-bad": "PHP:s XML-modul saknas.\nMediaWiki kräver funktioner i denna modul och kommer inte att fungera i den här konfigurationen.\nOm du kör Mandrake, installera php-xml-paketet.",
+ "config-pcre-old": "'''Kritiskt:''' PCRE $1 eller senare krävs.\nDin PHP-binär är länkad till PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mer information].",
"config-pcre-no-utf8": "'''Kritiskt:''' PHP:s PCRE-modul verkar vara kompilerat utan PCRE_UTF8-stöd.\nMediaWiki kräver stöd för UTF-8 för att fungera korrekt.",
"config-memory-raised": "PHPs <code>memory_limit</code> är $1, ökad till $2.",
"config-memory-bad": "''' Varning:''' PHP:s <code>memory_limit</code> är $1.\nDetta är förmodligen för lågt.\nInstallationen kan misslyckas!",
"config-header-postgres": "PostgreSQL-inställningar",
"config-header-sqlite": "SQLite-inställningar",
"config-header-oracle": "Oracle-inställningar",
+ "config-header-mssql": "Inställningar för Microsoft SQL Server",
"config-invalid-db-type": "Ogiltig databastyp",
"config-missing-db-name": "Du måste ange ett värde för \"{{int:config-db-name}}\".",
"config-missing-db-host": "Du måste ange ett värde för \"{{int:config-db-host}}\".",
"config-ns-generic": "Projekt",
"config-ns-site-name": "Samma som wikinamnet: $1",
"config-ns-other": "Annan (specificera)",
+ "config-ns-other-default": "MinWiki",
"config-ns-invalid": "Den angivna namnrymden \"<nowiki>$1</nowiki>\" är ogiltig.\nAnge en annan namnrymd för projektet.",
"config-ns-conflict": "Den angivna namnrymden \"<nowiki>$1</nowiki>\" står i konflikt med en standardnamnrymd för MediaWiki.\nAnge en annan namnrymd för projektet.",
"config-admin-box": "Administratörskonto",
"config-db-install-account": "Account ng tagagamit para sa pagluluklok",
"config-db-username": "Pangalang pangtagagamit ng kalipunan ng dato:",
"config-db-password": "Password sa kalipunan ng dato:",
- "config-db-password-empty": "Paki magpasok ng isang hudyat para sa bagong tagagamit ng kalipunan ng dato: $1.\nHabang maging maaari na makalikha ng mga tagagamit na walang mga hudyat, hindi ito ligtas.",
+ "config-db-password-empty": "Paki magpasok ng isang password para sa bagong tagagamit ng databas: $1.\nHabang maging maaari na makalikha ng mga tagagamit na walang mga passwrod, hindi ito ligtas.",
"config-db-install-username": "Ipasok ang pangalan ng tagagamit na gagamitin upang kumabit sa database habang isinasagawa ang pag-install.\nHindi ito ang pangalan ng tagagamit ng account ng MediaWiki; ito ang pangalan ng tagagamit para sa iyong database.",
"config-db-install-password": "Ipasok ang password na gagamitin upang maka-connect sa database habang isinasagawa ang pag-install.\nHindi ito ang password para sa account ng MediaWiki; ito ang password para sa iyong database.",
- "config-db-install-help": "Ipasok ang pangalan ng tagagamit at hudyat na gagamitin upang umugnay sa kalipunan ng dato habang isinasagawa ang pagluluklok.",
+ "config-db-install-help": "Ipasok ang pangalan ng tagagamit at password na gagamitin upang umugnay sa databasehabang isinasagawa ang pag-install.",
"config-db-account-lock": "Gamitin ang kaparehong pangalan at password habang nasa normal na operasyon",
"config-db-wiki-account": "Account ng tagagamit para sa pangkaraniwang pagpapaandar",
"config-db-wiki-help": "Ipasok ang pangalan ng tagagamit at password na gagamitin upang kumabit sa database habang nasa karaniwang pagtakbo ng wiki.\nKung hindi umiiral ang account, at ang pag-install ng account ay mayroong sapat na mga pribilehiyo, ang account na ito ng tagagamit ay lilikhain na mayroong pinaka mababang mga pribilehiyo na kailangan upang mapatakbo ang wiki.",
"config-db-schema-help": "Ang nasa itaas na panukala ay pangkaraniwang magiging maayos.\nBaguhin lamang ito kung alam mong kinakailangan.",
"config-pg-test-error": "Hindi makakabit sa kalipunan ng dato na '''$1''': $2",
"config-sqlite-dir": "Direktoryo ng dato ng SQLite:",
- "config-sqlite-dir-help": "Iniimbak ng SQLite ang lahat ng dato sa loob ng isang nag-iisang talaksan.\n\nAng ibibigay mong direktoryo ay dapat na maging masusulatan ng tagapaghain ng kasaputan habang nagluluklok.\n\n'''Hindi''' ito dapat na mapuntahan sa pamamagitan ng kasaputan, ito ang dahilan kung bakit hindi namin ito inilalagay sa kung nasaan ang iyong mga talaksan ng PHP.\n\nAng tagapagluklok ay magsusulat ng isang talaksang <code>.htaccess</code> na kasama ito, subalit kapag nabigo iyon mayroong isang tao na maaaring makakuha ng pagka nakakapunta sa iyong hilaw na kalipunan ng dato.\nKasama riyan ang hilaw na dato ng tagagamit (mga tirahan ng e-liham, pinaghalong mga hudyat) pati na ang nabura nang mga pagbabago at iba pang may pagbabawal na dato sa ibabaw ng wiki.\n\nIsaalang-alang ang paglalagay na magkakasama ang kalipunan ng dato sa ibang lugar, halimbawa na ang sa loob ng <code>/var/lib/mediawiki/yourwiki</code>.",
+ "config-sqlite-dir-help": "Iniimbak ng SQLite ang lahat ng dato sa loob ng isang nag-iisang file.\n\nAng ibibigay mong directory ay dapat na maging masusulatan ng tagapaghain ng kasaputan habang nag-i-install.\n\n'''Hindi''' ito dapat na mapuntahan sa pamamagitan ng web server, ito ang dahilan kung bakit hindi namin ito inilalagay sa kung nasaan ang iyong mga file ng PHP.\n\nAng installer ay magsusulat ng isang file na <code>.htaccess</code> na kasama ito, subalit kapag nabigo iyon mayroong isang tao na maaaring makakuha ng pagka nakakapunta sa iyong hilaw na database.\nKasama riyan ang hilaw na dato ng tagagamit (mga email address, pinaghalong mga password) pati na ang nabura nang mga pagbabago at iba pang may pagbabawal na dato ng wiki.\n\nIsaalang-alang ang paglalagay na magkakasama ang database sa ibang lugar, halimbawa na ang sa loob ng <code>/var/lib/mediawiki/yourwiki</code>.",
"config-oracle-def-ts": "Likas na nakatakdang puwang ng talahanayan:",
"config-oracle-temp-ts": "Pansamantalang puwang ng talahanayan:",
"config-type-mysql": "MySQL",
"config-show-table-status": "Nabigo ang pagtatanong na IPAKITA ANG KALAGAYAN NG TALAHANAYAN!",
"config-unknown-collation": "'''Babala:''' Ang kalipunan ng dato ay gumagagamit ng hindi nakikilalang pag-iipon.",
"config-db-web-account": "Account ng kalipunan ng dato para sa pagpunta sa web",
- "config-db-web-help": "Piliin ang pangalan ng tagagamit at hudyat na gagamitin ng tagapaghain ng web upang umugnay sa tagapaghain ng kalipunan ng dato, habang nasa pangkaraniwang pagtakbo ng wiki.",
+ "config-db-web-help": "Piliin ang pangalan ng tagagamit at password na gagamitin ng tagapaghain ng web upang umugnay sa tagapaghain ng database, habang nasa pangkaraniwang pagtakbo ng wiki.",
"config-db-web-account-same": "Gamitin ang gayun din account katulad ng sa pag-install",
"config-db-web-create": "Likhain ang account kung hindi pa ito umiiral",
"config-db-web-no-create-privs": "Ang tinukoy mong account na iluluklok ay walang sapat na mga pribilehiyo upang makalikha ng isang account.\nAng account na tutukuyin mo rito ay umiiral na dapat.",
"config-admin-password-blank": "Magpasok ng isang password para sa account ng tagapangasiwa.",
"config-admin-password-mismatch": "Hindi magkatugma ang ipinasok mong dalawang mga password.",
"config-admin-email": "Tirahan ng e-liham:",
- "config-admin-email-help": "Magpasok dito ng isang tirahan ng e-liham upang mapahintulutan kang makatanggap ng e-liham mula sa iba pang mga tagagamit sa ibabaw ng wiki, itakdang muli ang hudyat mo, at mapabatiran ng mga pagbabago sa mga pahinang nasa ibabaw ng iyong tala ng mga binabantayan. Maiiwanan mo na walang laman ang hanay na ito.",
+ "config-admin-email-help": "Magpasok dito ng isang email address upang mapahintulutan kang makatanggap ng email mula sa iba pang mga tagagamit ng wiki, itakdang muli ang password mo, at mabatid ang mga pagbabago sa mga pahinang nasa ibabaw ng iyong tala ng mga binabantayan. Maiiwanan mo na walang laman ang field na ito.",
"config-admin-error-user": "Panloob na kamalian kapag nililikha ang isang tagapangasiwa na may pangalang \"<nowiki>$1</nowiki>\".",
- "config-admin-error-password": "Panloob na kamalian kapag nagtatakda ng isang hudyat na para sa tagapangasiwang \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
+ "config-admin-error-password": "Panloob na kamalian kapag nagtatakda ng isang password na para sa tagapangasiwang \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
"config-admin-error-bademail": "Nagpasok ka ng isang hindi katanggap-tanggap na tirahan ng e-liham.",
"config-subscribe": "Tumanggap mula sa [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce talaan ng mga pinadadalhan ng mga nilalabas na mga pabatid].",
"config-subscribe-help": "Isang itong tala ng pagliliham na mababa ang dami na ginagamit para sa pagpapakawala ng mga pahayag, kabilang na ang mahahalagang mga pahayag na pangkatiwasayan. Dapat kang magpasipi nito at isapanahon ang iyong nakaluklok na MediaWiki kapag lumalabas ang bagong mga bersiyon.",
"Joseph",
"Rhinestorm",
"SiLveRLeaD",
- "Trncmvsr"
+ "Trncmvsr",
+ "Sayginer"
]
},
"config-desc": "MediaWiki yükleyicisi",
"config-db-install-account": "Yükleme için kullanıcı hesabı",
"config-db-username": "Veritabanı kullanıcı adı:",
"config-db-password": "Veritabanı parolası:",
+ "config-db-username-empty": "\"{{int:config-db-username}}\" için bir değer girmelisiniz.",
"config-db-install-username": "Yükleme sırasında veritabanına bağlanmak için kullanılan kullanıcı adını girin.\nBu MediaWiki hesabının kullanıcı adı değildir; Bu veritabanın kullanıcı adıdır.",
"config-db-wiki-account": "Kullanıcı hesabı için normal işlem",
"config-db-prefix": "Veritabanı Tablo öneki:",
"config-admin-name": "Kullanıcı adınız:",
"config-admin-password": "Şifre:",
"config-admin-password-confirm": "Şifre tekrar:",
+ "config-admin-help": "Buraya tercih ettiğiniz kullanıcı adını girin; örneğin \"Joe Bloggs\". Bu vikide oturum açmak için kullanacağınız addır.",
"config-admin-name-blank": "Bir yönetici kullanıcı adını giriniz.",
"config-admin-name-invalid": "Belirtilen ad \"<nowiki> $1 </nowiki>\" geçersiz.\nFarklı bir kullanıcı adı belirtin.",
"config-admin-password-blank": "Yönetici hesabı için bir parola girin.",
"config-optional-skip": "Şimdiden sıkıldım, sadece wikiyi yükle.",
"config-profile": "Kullanıcı hakları profili:",
"config-profile-wiki": "Açık wiki",
+ "config-profile-no-anon": "Hesap oluşturmak gerekli",
"config-profile-fishbowl": "Yalnızca yetkili editörler",
"config-profile-private": "Özel wiki",
+ "config-profile-help": "Vikiler, mümkün olan en fazla kişiye değişiklik imkânı verdiğinizde, en iyi şekilde çalışır.\nMediaWiki'de son değişiklikleri incelemek ve tecrübesiz veya kötü niyetli kullanıcıların verdiği zararları geri almak kolaydır.\n\nAncak birçok kişi MediaWiki'yi farklı şekillerde kullanışlı bulmaktadır ve bazen herkesi viki yolunun faydalarına ikna etmek zordur.\nYani seçim sizin.\n\n<strong>{{int:config-profile-wiki}}</strong> modeli, giriş yapmamış olsa bile herkese değişiklik izni verir.\n\n<strong>{{int:config-profile-no-anon}}</strong> kullanan bir viki ise daha izlenebilirdir ancak sıradan, basit, gündelik katkı yapan kullanıcıları caydırabilir.\n\n<strong>{{int:config-profile-fishbowl}}</strong> onaylanmış kullanıcıların değişikliklerine izin verir ama herkes sayfaları ve sayfa geçmişlerini görebilir.\n\n<strong>{{int:config-profile-private}}</strong> sadece onaylanmış kullanıcıları değişiklik yapma ve sayfaları görme imkânı tanır.\n\nDaha karmaşık kullanıcı hakkı ayarları, yüklemeden sonra görülebilir; [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights ilgili kılavuza] bakınız.",
"config-license": "Telif Hakkı ve Lisans",
"config-license-gfdl": "GNU Free Documentation License 1.3 veya üstü",
"config-license-pd": "Kamu Malı",
"config-email-settings": "E-posta ayarları",
"config-enable-email": "Giden e-posta etkinleştirme",
"config-email-user": "Kullanıcıdan kullanıcıya e-posta gönderimini etkinleştir",
+ "config-email-user-help": "Eğer tercihlerinde etkinleştirmişlerse, kullanıcıların birbirlerine e-posta göndermesine izin ver.",
+ "config-email-usertalk": "Kullanıcı mesaj sayfası bildirimlerini etkinleştir",
"config-email-watchlist": "Watchlist bildirimini etkinleştirmek",
"config-email-auth": "E-posta kimlik doğrulamasını etkinleştir",
"config-email-sender": "E-posta adresini ayarlayın",
* Get an image size array like that returned by getimagesize(), or false if it
* can't be determined.
*
+ * This function is used for determining the width, height and bitdepth directly
+ * from an image. The results are stored in the database in the img_width,
+ * img_height, img_bits fields.
+ *
+ * @note If this is a multipage file, return the width and height of the
+ * first page.
+ *
* @param File $image The image object, or false if there isn't one
* @param string $path the filename
* @return array Follow the format of PHP getimagesize() internal function.
- * See http://www.php.net/getimagesize
+ * See http://www.php.net/getimagesize. MediaWiki will only ever use the
+ * first two array keys (the width and height), and the 'bits' associative
+ * key. All other array keys are ignored. Returning a 'bits' key is optional
+ * as not all formats have a notion of "bitdepth".
*/
abstract function getImageSize( $image, $path );
* @param File $image The image object, or false if there isn't one.
* Warning, FSFile::getPropsFromPath might pass an (object)array() instead (!)
* @param string $path The filename
- * @return string
+ * @return string A string of metadata in php serialized form (Run through serialize())
*/
function getMetadata( $image, $path ) {
return '';
*
* This is not used for validating metadata, this is used for the api when returning
* metadata, since api content formats should stay the same over time, and so things
- * using ForiegnApiRepo can keep backwards compatibility
+ * using ForeignApiRepo can keep backwards compatibility
*
* All core media handlers share a common version number, and extensions can
* use the GetMetadataVersion hook to append to the array (they should append a unique
/**
* Get a string describing the type of metadata, for display purposes.
+ *
+ * @note This method is currently unused.
* @param File $image
* @return string
*/
* If it returns MediaHandler::METADATA_BAD (or false), Image
* will reload the metadata from the file and update the database.
* MediaHandler::METADATA_GOOD for if the metadata is a-ok,
- * MediaHanlder::METADATA_COMPATIBLE if metadata is old but backwards
+ * MediaHandler::METADATA_COMPATIBLE if metadata is old but backwards
* compatible (which may or may not trigger a metadata reload).
+ *
+ * @note Returning self::METADATA_BAD will trigger a metadata reload from
+ * file on page view. Always returning this from a broken file, or suddenly
+ * triggering as bad metadata for a large number of files can cause
+ * performance problems.
* @param File $image
- * @param array $metadata
+ * @param string $metadata The metadata in serialized form
* @return bool
*/
function isMetadataValid( $image, $metadata ) {
--- /dev/null
+<?php
+/**
+ * User interface for page actions.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Class for viewing MediaWiki article and history.
+ *
+ * This maintains WikiPage functions for backwards compatibility.
+ *
+ * @todo Move and rewrite code to an Action class
+ *
+ * See design.txt for an overview.
+ * Note: edit user interface and cache support functions have been
+ * moved to separate EditPage and HTMLFileCache classes.
+ *
+ * @internal documentation reviewed 15 Mar 2010
+ */
+class Article implements Page {
+ /** @var IContextSource The context this Article is executed in */
+ protected $mContext;
+
+ /** @var WikiPage The WikiPage object of this instance */
+ protected $mPage;
+
+ /** @var ParserOptions ParserOptions object for $wgUser articles */
+ public $mParserOptions;
+
+ /**
+ * @var string Text of the revision we are working on
+ * @todo BC cruft
+ */
+ public $mContent;
+
+ /**
+ * @var Content Content of the revision we are working on
+ * @since 1.21
+ */
+ protected $mContentObject;
+
+ /** @var bool Is the content ($mContent) already loaded? */
+ protected $mContentLoaded = false;
+
+ /** @var int|null The oldid of the article that is to be shown, 0 for the current revision */
+ protected $mOldId;
+
+ /** @var Title Title from which we were redirected here */
+ protected $mRedirectedFrom = null;
+
+ /** @var string|bool URL to redirect to or false if none */
+ protected $mRedirectUrl = false;
+
+ /** @var int Revision ID of revision we are working on */
+ protected $mRevIdFetched = 0;
+
+ /** @var Revision Revision we are working on */
+ protected $mRevision = null;
+
+ /** @var ParserOutput */
+ public $mParserOutput;
+
+ /**
+ * Constructor and clear the article
+ * @param Title $title Reference to a Title object.
+ * @param int $oldId Revision ID, null to fetch from request, zero for current
+ */
+ public function __construct( Title $title, $oldId = null ) {
+ $this->mOldId = $oldId;
+ $this->mPage = $this->newPage( $title );
+ }
+
+ /**
+ * @param Title $title
+ * @return WikiPage
+ */
+ protected function newPage( Title $title ) {
+ return new WikiPage( $title );
+ }
+
+ /**
+ * Constructor from a page id
+ * @param int $id Article ID to load
+ * @return Article|null
+ */
+ public static function newFromID( $id ) {
+ $t = Title::newFromID( $id );
+ # @todo FIXME: Doesn't inherit right
+ return $t == null ? null : new self( $t );
+ # return $t == null ? null : new static( $t ); // PHP 5.3
+ }
+
+ /**
+ * Create an Article object of the appropriate class for the given page.
+ *
+ * @param Title $title
+ * @param IContextSource $context
+ * @return Article
+ */
+ public static function newFromTitle( $title, IContextSource $context ) {
+ if ( NS_MEDIA == $title->getNamespace() ) {
+ // FIXME: where should this go?
+ $title = Title::makeTitle( NS_FILE, $title->getDBkey() );
+ }
+
+ $page = null;
+ wfRunHooks( 'ArticleFromTitle', array( &$title, &$page, $context ) );
+ if ( !$page ) {
+ switch ( $title->getNamespace() ) {
+ case NS_FILE:
+ $page = new ImagePage( $title );
+ break;
+ case NS_CATEGORY:
+ $page = new CategoryPage( $title );
+ break;
+ default:
+ $page = new Article( $title );
+ }
+ }
+ $page->setContext( $context );
+
+ return $page;
+ }
+
+ /**
+ * Create an Article object of the appropriate class for the given page.
+ *
+ * @param WikiPage $page
+ * @param IContextSource $context
+ * @return Article
+ */
+ public static function newFromWikiPage( WikiPage $page, IContextSource $context ) {
+ $article = self::newFromTitle( $page->getTitle(), $context );
+ $article->mPage = $page; // override to keep process cached vars
+ return $article;
+ }
+
+ /**
+ * Tell the page view functions that this view was redirected
+ * from another page on the wiki.
+ * @param Title $from
+ */
+ public function setRedirectedFrom( Title $from ) {
+ $this->mRedirectedFrom = $from;
+ }
+
+ /**
+ * Get the title object of the article
+ *
+ * @return Title Title object of this page
+ */
+ public function getTitle() {
+ return $this->mPage->getTitle();
+ }
+
+ /**
+ * Get the WikiPage object of this instance
+ *
+ * @since 1.19
+ * @return WikiPage
+ */
+ public function getPage() {
+ return $this->mPage;
+ }
+
+ /**
+ * Clear the object
+ */
+ public function clear() {
+ $this->mContentLoaded = false;
+
+ $this->mRedirectedFrom = null; # Title object if set
+ $this->mRevIdFetched = 0;
+ $this->mRedirectUrl = false;
+
+ $this->mPage->clear();
+ }
+
+ /**
+ * Note that getContent/loadContent do not follow redirects anymore.
+ * If you need to fetch redirectable content easily, try
+ * the shortcut in WikiPage::getRedirectTarget()
+ *
+ * This function has side effects! Do not use this function if you
+ * only want the real revision text if any.
+ *
+ * @deprecated since 1.21; use WikiPage::getContent() instead
+ *
+ * @return string Return the text of this revision
+ */
+ public function getContent() {
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+ $content = $this->getContentObject();
+ return ContentHandler::getContentText( $content );
+ }
+
+ /**
+ * Returns a Content object representing the pages effective display content,
+ * not necessarily the revision's content!
+ *
+ * Note that getContent/loadContent do not follow redirects anymore.
+ * If you need to fetch redirectable content easily, try
+ * the shortcut in WikiPage::getRedirectTarget()
+ *
+ * This function has side effects! Do not use this function if you
+ * only want the real revision text if any.
+ *
+ * @return Content Return the content of this revision
+ *
+ * @since 1.21
+ */
+ protected function getContentObject() {
+ wfProfileIn( __METHOD__ );
+
+ if ( $this->mPage->getID() === 0 ) {
+ # If this is a MediaWiki:x message, then load the messages
+ # and return the message value for x.
+ if ( $this->getTitle()->getNamespace() == NS_MEDIAWIKI ) {
+ $text = $this->getTitle()->getDefaultMessageText();
+ if ( $text === false ) {
+ $text = '';
+ }
+
+ $content = ContentHandler::makeContent( $text, $this->getTitle() );
+ } else {
+ $message = $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon';
+ $content = new MessageContent( $message, null, 'parsemag' );
+ }
+ } else {
+ $this->fetchContentObject();
+ $content = $this->mContentObject;
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $content;
+ }
+
+ /**
+ * @return int The oldid of the article that is to be shown, 0 for the current revision
+ */
+ public function getOldID() {
+ if ( is_null( $this->mOldId ) ) {
+ $this->mOldId = $this->getOldIDFromRequest();
+ }
+
+ return $this->mOldId;
+ }
+
+ /**
+ * Sets $this->mRedirectUrl to a correct URL if the query parameters are incorrect
+ *
+ * @return int The old id for the request
+ */
+ public function getOldIDFromRequest() {
+ $this->mRedirectUrl = false;
+
+ $request = $this->getContext()->getRequest();
+ $oldid = $request->getIntOrNull( 'oldid' );
+
+ if ( $oldid === null ) {
+ return 0;
+ }
+
+ if ( $oldid !== 0 ) {
+ # Load the given revision and check whether the page is another one.
+ # In that case, update this instance to reflect the change.
+ if ( $oldid === $this->mPage->getLatest() ) {
+ $this->mRevision = $this->mPage->getRevision();
+ } else {
+ $this->mRevision = Revision::newFromId( $oldid );
+ if ( $this->mRevision !== null ) {
+ // Revision title doesn't match the page title given?
+ if ( $this->mPage->getID() != $this->mRevision->getPage() ) {
+ $function = array( get_class( $this->mPage ), 'newFromID' );
+ $this->mPage = call_user_func( $function, $this->mRevision->getPage() );
+ }
+ }
+ }
+ }
+
+ if ( $request->getVal( 'direction' ) == 'next' ) {
+ $nextid = $this->getTitle()->getNextRevisionID( $oldid );
+ if ( $nextid ) {
+ $oldid = $nextid;
+ $this->mRevision = null;
+ } else {
+ $this->mRedirectUrl = $this->getTitle()->getFullURL( 'redirect=no' );
+ }
+ } elseif ( $request->getVal( 'direction' ) == 'prev' ) {
+ $previd = $this->getTitle()->getPreviousRevisionID( $oldid );
+ if ( $previd ) {
+ $oldid = $previd;
+ $this->mRevision = null;
+ }
+ }
+
+ return $oldid;
+ }
+
+ /**
+ * Load the revision (including text) into this object
+ *
+ * @deprecated since 1.19; use fetchContent()
+ */
+ function loadContent() {
+ wfDeprecated( __METHOD__, '1.19' );
+ $this->fetchContent();
+ }
+
+ /**
+ * Get text of an article from database
+ * Does *NOT* follow redirects.
+ *
+ * @protected
+ * @note This is really internal functionality that should really NOT be
+ * used by other functions. For accessing article content, use the WikiPage
+ * class, especially WikiBase::getContent(). However, a lot of legacy code
+ * uses this method to retrieve page text from the database, so the function
+ * has to remain public for now.
+ *
+ * @return string|bool String containing article contents, or false if null
+ * @deprecated since 1.21, use WikiPage::getContent() instead
+ */
+ function fetchContent() { #BC cruft!
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+
+ if ( $this->mContentLoaded && $this->mContent ) {
+ return $this->mContent;
+ }
+
+ wfProfileIn( __METHOD__ );
+
+ $content = $this->fetchContentObject();
+
+ if ( !$content ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
+ // @todo Get rid of mContent everywhere!
+ $this->mContent = ContentHandler::getContentText( $content );
+ ContentHandler::runLegacyHooks( 'ArticleAfterFetchContent', array( &$this, &$this->mContent ) );
+
+ wfProfileOut( __METHOD__ );
+
+ return $this->mContent;
+ }
+
+ /**
+ * Get text content object
+ * Does *NOT* follow redirects.
+ * @todo When is this null?
+ *
+ * @note Code that wants to retrieve page content from the database should
+ * use WikiPage::getContent().
+ *
+ * @return Content|null|bool
+ *
+ * @since 1.21
+ */
+ protected function fetchContentObject() {
+ if ( $this->mContentLoaded ) {
+ return $this->mContentObject;
+ }
+
+ wfProfileIn( __METHOD__ );
+
+ $this->mContentLoaded = true;
+ $this->mContent = null;
+
+ $oldid = $this->getOldID();
+
+ # Pre-fill content with error message so that if something
+ # fails we'll have something telling us what we intended.
+ //XXX: this isn't page content but a UI message. horrible.
+ $this->mContentObject = new MessageContent( 'missing-revision', array( $oldid ), array() );
+
+ if ( $oldid ) {
+ # $this->mRevision might already be fetched by getOldIDFromRequest()
+ if ( !$this->mRevision ) {
+ $this->mRevision = Revision::newFromId( $oldid );
+ if ( !$this->mRevision ) {
+ wfDebug( __METHOD__ . " failed to retrieve specified revision, id $oldid\n" );
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+ }
+ } else {
+ if ( !$this->mPage->getLatest() ) {
+ wfDebug( __METHOD__ . " failed to find page data for title " .
+ $this->getTitle()->getPrefixedText() . "\n" );
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
+ $this->mRevision = $this->mPage->getRevision();
+
+ if ( !$this->mRevision ) {
+ wfDebug( __METHOD__ . " failed to retrieve current page, rev_id " .
+ $this->mPage->getLatest() . "\n" );
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+ }
+
+ // @todo FIXME: Horrible, horrible! This content-loading interface just plain sucks.
+ // We should instead work with the Revision object when we need it...
+ // Loads if user is allowed
+ $this->mContentObject = $this->mRevision->getContent(
+ Revision::FOR_THIS_USER,
+ $this->getContext()->getUser()
+ );
+ $this->mRevIdFetched = $this->mRevision->getId();
+
+ wfRunHooks( 'ArticleAfterFetchContentObject', array( &$this, &$this->mContentObject ) );
+
+ wfProfileOut( __METHOD__ );
+
+ return $this->mContentObject;
+ }
+
+ /**
+ * Returns true if the currently-referenced revision is the current edit
+ * to this page (and it exists).
+ * @return bool
+ */
+ public function isCurrent() {
+ # If no oldid, this is the current version.
+ if ( $this->getOldID() == 0 ) {
+ return true;
+ }
+
+ return $this->mPage->exists() && $this->mRevision && $this->mRevision->isCurrent();
+ }
+
+ /**
+ * Get the fetched Revision object depending on request parameters or null
+ * on failure.
+ *
+ * @since 1.19
+ * @return Revision|null
+ */
+ public function getRevisionFetched() {
+ $this->fetchContentObject();
+
+ return $this->mRevision;
+ }
+
+ /**
+ * Use this to fetch the rev ID used on page views
+ *
+ * @return int Revision ID of last article revision
+ */
+ public function getRevIdFetched() {
+ if ( $this->mRevIdFetched ) {
+ return $this->mRevIdFetched;
+ } else {
+ return $this->mPage->getLatest();
+ }
+ }
+
+ /**
+ * This is the default action of the index.php entry point: just view the
+ * page of the given title.
+ */
+ public function view() {
+ global $wgUseFileCache, $wgUseETag, $wgDebugToolbar;
+
+ wfProfileIn( __METHOD__ );
+
+ # Get variables from query string
+ # As side effect this will load the revision and update the title
+ # in a revision ID is passed in the request, so this should remain
+ # the first call of this method even if $oldid is used way below.
+ $oldid = $this->getOldID();
+
+ $user = $this->getContext()->getUser();
+ # Another whitelist check in case getOldID() is altering the title
+ $permErrors = $this->getTitle()->getUserPermissionsErrors( 'read', $user );
+ if ( count( $permErrors ) ) {
+ wfDebug( __METHOD__ . ": denied on secondary read check\n" );
+ wfProfileOut( __METHOD__ );
+ throw new PermissionsError( 'read', $permErrors );
+ }
+
+ $outputPage = $this->getContext()->getOutput();
+ # getOldID() may as well want us to redirect somewhere else
+ if ( $this->mRedirectUrl ) {
+ $outputPage->redirect( $this->mRedirectUrl );
+ wfDebug( __METHOD__ . ": redirecting due to oldid\n" );
+ wfProfileOut( __METHOD__ );
+
+ return;
+ }
+
+ # If we got diff in the query, we want to see a diff page instead of the article.
+ if ( $this->getContext()->getRequest()->getCheck( 'diff' ) ) {
+ wfDebug( __METHOD__ . ": showing diff page\n" );
+ $this->showDiffPage();
+ wfProfileOut( __METHOD__ );
+
+ return;
+ }
+
+ # Set page title (may be overridden by DISPLAYTITLE)
+ $outputPage->setPageTitle( $this->getTitle()->getPrefixedText() );
+
+ $outputPage->setArticleFlag( true );
+ # Allow frames by default
+ $outputPage->allowClickjacking();
+
+ $parserCache = ParserCache::singleton();
+
+ $parserOptions = $this->getParserOptions();
+ # Render printable version, use printable version cache
+ if ( $outputPage->isPrintable() ) {
+ $parserOptions->setIsPrintable( true );
+ $parserOptions->setEditSection( false );
+ } elseif ( !$this->isCurrent() || !$this->getTitle()->quickUserCan( 'edit', $user ) ) {
+ $parserOptions->setEditSection( false );
+ }
+
+ # Try client and file cache
+ if ( !$wgDebugToolbar && $oldid === 0 && $this->mPage->checkTouched() ) {
+ if ( $wgUseETag ) {
+ $outputPage->setETag( $parserCache->getETag( $this, $parserOptions ) );
+ }
+
+ # Is it client cached?
+ if ( $outputPage->checkLastModified( $this->mPage->getTouched() ) ) {
+ wfDebug( __METHOD__ . ": done 304\n" );
+ wfProfileOut( __METHOD__ );
+
+ return;
+ # Try file cache
+ } elseif ( $wgUseFileCache && $this->tryFileCache() ) {
+ wfDebug( __METHOD__ . ": done file cache\n" );
+ # tell wgOut that output is taken care of
+ $outputPage->disable();
+ $this->mPage->doViewUpdates( $user, $oldid );
+ wfProfileOut( __METHOD__ );
+
+ return;
+ }
+ }
+
+ # Should the parser cache be used?
+ $useParserCache = $this->mPage->isParserCacheUsed( $parserOptions, $oldid );
+ wfDebug( 'Article::view using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
+ if ( $user->getStubThreshold() ) {
+ wfIncrStats( 'pcache_miss_stub' );
+ }
+
+ $this->showRedirectedFromHeader();
+ $this->showNamespaceHeader();
+
+ # Iterate through the possible ways of constructing the output text.
+ # Keep going until $outputDone is set, or we run out of things to do.
+ $pass = 0;
+ $outputDone = false;
+ $this->mParserOutput = false;
+
+ while ( !$outputDone && ++$pass ) {
+ switch ( $pass ) {
+ case 1:
+ wfRunHooks( 'ArticleViewHeader', array( &$this, &$outputDone, &$useParserCache ) );
+ break;
+ case 2:
+ # Early abort if the page doesn't exist
+ if ( !$this->mPage->exists() ) {
+ wfDebug( __METHOD__ . ": showing missing article\n" );
+ $this->showMissingArticle();
+ $this->mPage->doViewUpdates( $user );
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+
+ # Try the parser cache
+ if ( $useParserCache ) {
+ $this->mParserOutput = $parserCache->get( $this, $parserOptions );
+
+ if ( $this->mParserOutput !== false ) {
+ if ( $oldid ) {
+ wfDebug( __METHOD__ . ": showing parser cache contents for current rev permalink\n" );
+ $this->setOldSubtitle( $oldid );
+ } else {
+ wfDebug( __METHOD__ . ": showing parser cache contents\n" );
+ }
+ $outputPage->addParserOutput( $this->mParserOutput );
+ # Ensure that UI elements requiring revision ID have
+ # the correct version information.
+ $outputPage->setRevisionId( $this->mPage->getLatest() );
+ # Preload timestamp to avoid a DB hit
+ $cachedTimestamp = $this->mParserOutput->getTimestamp();
+ if ( $cachedTimestamp !== null ) {
+ $outputPage->setRevisionTimestamp( $cachedTimestamp );
+ $this->mPage->setTimestamp( $cachedTimestamp );
+ }
+ $outputDone = true;
+ }
+ }
+ break;
+ case 3:
+ # This will set $this->mRevision if needed
+ $this->fetchContentObject();
+
+ # Are we looking at an old revision
+ if ( $oldid && $this->mRevision ) {
+ $this->setOldSubtitle( $oldid );
+
+ if ( !$this->showDeletedRevisionHeader() ) {
+ wfDebug( __METHOD__ . ": cannot view deleted revision\n" );
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+ }
+
+ # Ensure that UI elements requiring revision ID have
+ # the correct version information.
+ $outputPage->setRevisionId( $this->getRevIdFetched() );
+ # Preload timestamp to avoid a DB hit
+ $outputPage->setRevisionTimestamp( $this->getTimestamp() );
+
+ # Pages containing custom CSS or JavaScript get special treatment
+ if ( $this->getTitle()->isCssOrJsPage() || $this->getTitle()->isCssJsSubpage() ) {
+ wfDebug( __METHOD__ . ": showing CSS/JS source\n" );
+ $this->showCssOrJsPage();
+ $outputDone = true;
+ } elseif ( !wfRunHooks( 'ArticleContentViewCustom',
+ array( $this->fetchContentObject(), $this->getTitle(), $outputPage ) ) ) {
+
+ # Allow extensions do their own custom view for certain pages
+ $outputDone = true;
+ } elseif ( !ContentHandler::runLegacyHooks( 'ArticleViewCustom',
+ array( $this->fetchContentObject(), $this->getTitle(), $outputPage ) ) ) {
+
+ # Allow extensions do their own custom view for certain pages
+ $outputDone = true;
+ }
+ break;
+ case 4:
+ # Run the parse, protected by a pool counter
+ wfDebug( __METHOD__ . ": doing uncached parse\n" );
+
+ $content = $this->getContentObject();
+ $poolArticleView = new PoolWorkArticleView( $this->getPage(), $parserOptions,
+ $this->getRevIdFetched(), $useParserCache, $content );
+
+ if ( !$poolArticleView->execute() ) {
+ $error = $poolArticleView->getError();
+ if ( $error ) {
+ $outputPage->clearHTML(); // for release() errors
+ $outputPage->enableClientCache( false );
+ $outputPage->setRobotPolicy( 'noindex,nofollow' );
+
+ $errortext = $error->getWikiText( false, 'view-pool-error' );
+ $outputPage->addWikiText( '<div class="errorbox">' . $errortext . '</div>' );
+ }
+ # Connection or timeout error
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+
+ $this->mParserOutput = $poolArticleView->getParserOutput();
+ $outputPage->addParserOutput( $this->mParserOutput );
+ if ( $content->getRedirectTarget() ) {
+ $outputPage->addSubtitle( wfMessage( 'redirectpagesub' )->parse() );
+ }
+
+ # Don't cache a dirty ParserOutput object
+ if ( $poolArticleView->getIsDirty() ) {
+ $outputPage->setSquidMaxage( 0 );
+ $outputPage->addHTML( "<!-- parser cache is expired, " .
+ "sending anyway due to pool overload-->\n" );
+ }
+
+ $outputDone = true;
+ break;
+ # Should be unreachable, but just in case...
+ default:
+ break 2;
+ }
+ }
+
+ # Get the ParserOutput actually *displayed* here.
+ # Note that $this->mParserOutput is the *current* version output.
+ $pOutput = ( $outputDone instanceof ParserOutput )
+ ? $outputDone // object fetched by hook
+ : $this->mParserOutput;
+
+ # Adjust title for main page & pages with displaytitle
+ if ( $pOutput ) {
+ $this->adjustDisplayTitle( $pOutput );
+ }
+
+ # For the main page, overwrite the <title> element with the con-
+ # tents of 'pagetitle-view-mainpage' instead of the default (if
+ # that's not empty).
+ # This message always exists because it is in the i18n files
+ if ( $this->getTitle()->isMainPage() ) {
+ $msg = wfMessage( 'pagetitle-view-mainpage' )->inContentLanguage();
+ if ( !$msg->isDisabled() ) {
+ $outputPage->setHTMLTitle( $msg->title( $this->getTitle() )->text() );
+ }
+ }
+
+ # Check for any __NOINDEX__ tags on the page using $pOutput
+ $policy = $this->getRobotPolicy( 'view', $pOutput );
+ $outputPage->setIndexPolicy( $policy['index'] );
+ $outputPage->setFollowPolicy( $policy['follow'] );
+
+ $this->showViewFooter();
+ $this->mPage->doViewUpdates( $user, $oldid );
+
+ $outputPage->addModules( 'mediawiki.action.view.postEdit' );
+
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Adjust title for pages with displaytitle, -{T|}- or language conversion
+ * @param ParserOutput $pOutput
+ */
+ public function adjustDisplayTitle( ParserOutput $pOutput ) {
+ # Adjust the title if it was set by displaytitle, -{T|}- or language conversion
+ $titleText = $pOutput->getTitleText();
+ if ( strval( $titleText ) !== '' ) {
+ $this->getContext()->getOutput()->setPageTitle( $titleText );
+ }
+ }
+
+ /**
+ * Show a diff page according to current request variables. For use within
+ * Article::view() only, other callers should use the DifferenceEngine class.
+ *
+ * @todo Make protected
+ */
+ public function showDiffPage() {
+ $request = $this->getContext()->getRequest();
+ $user = $this->getContext()->getUser();
+ $diff = $request->getVal( 'diff' );
+ $rcid = $request->getVal( 'rcid' );
+ $diffOnly = $request->getBool( 'diffonly', $user->getOption( 'diffonly' ) );
+ $purge = $request->getVal( 'action' ) == 'purge';
+ $unhide = $request->getInt( 'unhide' ) == 1;
+ $oldid = $this->getOldID();
+
+ $rev = $this->getRevisionFetched();
+
+ if ( !$rev ) {
+ $this->getContext()->getOutput()->setPageTitle( wfMessage( 'errorpagetitle' ) );
+ $this->getContext()->getOutput()->addWikiMsg( 'difference-missing-revision', $oldid, 1 );
+ return;
+ }
+
+ $contentHandler = $rev->getContentHandler();
+ $de = $contentHandler->createDifferenceEngine(
+ $this->getContext(),
+ $oldid,
+ $diff,
+ $rcid,
+ $purge,
+ $unhide
+ );
+
+ // DifferenceEngine directly fetched the revision:
+ $this->mRevIdFetched = $de->mNewid;
+ $de->showDiffPage( $diffOnly );
+
+ // Run view updates for the newer revision being diffed (and shown
+ // below the diff if not $diffOnly).
+ list( $old, $new ) = $de->mapDiffPrevNext( $oldid, $diff );
+ // New can be false, convert it to 0 - this conveniently means the latest revision
+ $this->mPage->doViewUpdates( $user, (int)$new );
+ }
+
+ /**
+ * Show a page view for a page formatted as CSS or JavaScript. To be called by
+ * Article::view() only.
+ *
+ * This exists mostly to serve the deprecated ShowRawCssJs hook (used to customize these views).
+ * It has been replaced by the ContentGetParserOutput hook, which lets you do the same but with
+ * more flexibility.
+ *
+ * @param bool $showCacheHint Whether to show a message telling the user
+ * to clear the browser cache (default: true).
+ */
+ protected function showCssOrJsPage( $showCacheHint = true ) {
+ $outputPage = $this->getContext()->getOutput();
+
+ if ( $showCacheHint ) {
+ $dir = $this->getContext()->getLanguage()->getDir();
+ $lang = $this->getContext()->getLanguage()->getCode();
+
+ $outputPage->wrapWikiMsg(
+ "<div id='mw-clearyourcache' lang='$lang' dir='$dir' class='mw-content-$dir'>\n$1\n</div>",
+ 'clearyourcache'
+ );
+ }
+
+ $this->fetchContentObject();
+
+ if ( $this->mContentObject ) {
+ // Give hooks a chance to customise the output
+ if ( ContentHandler::runLegacyHooks(
+ 'ShowRawCssJs',
+ array( $this->mContentObject, $this->getTitle(), $outputPage ) )
+ ) {
+ // If no legacy hooks ran, display the content of the parser output, including RL modules,
+ // but excluding metadata like categories and language links
+ $po = $this->mContentObject->getParserOutput( $this->getTitle() );
+ $outputPage->addParserOutputContent( $po );
+ }
+ }
+ }
+
+ /**
+ * Get the robot policy to be used for the current view
+ * @param string $action The action= GET parameter
+ * @param ParserOutput|null $pOutput
+ * @return array The policy that should be set
+ * @todo: actions other than 'view'
+ */
+ public function getRobotPolicy( $action, $pOutput = null ) {
+ global $wgArticleRobotPolicies, $wgNamespaceRobotPolicies, $wgDefaultRobotPolicy;
+
+ $ns = $this->getTitle()->getNamespace();
+
+ # Don't index user and user talk pages for blocked users (bug 11443)
+ if ( ( $ns == NS_USER || $ns == NS_USER_TALK ) && !$this->getTitle()->isSubpage() ) {
+ $specificTarget = null;
+ $vagueTarget = null;
+ $titleText = $this->getTitle()->getText();
+ if ( IP::isValid( $titleText ) ) {
+ $vagueTarget = $titleText;
+ } else {
+ $specificTarget = $titleText;
+ }
+ if ( Block::newFromTarget( $specificTarget, $vagueTarget ) instanceof Block ) {
+ return array(
+ 'index' => 'noindex',
+ 'follow' => 'nofollow'
+ );
+ }
+ }
+
+ if ( $this->mPage->getID() === 0 || $this->getOldID() ) {
+ # Non-articles (special pages etc), and old revisions
+ return array(
+ 'index' => 'noindex',
+ 'follow' => 'nofollow'
+ );
+ } elseif ( $this->getContext()->getOutput()->isPrintable() ) {
+ # Discourage indexing of printable versions, but encourage following
+ return array(
+ 'index' => 'noindex',
+ 'follow' => 'follow'
+ );
+ } elseif ( $this->getContext()->getRequest()->getInt( 'curid' ) ) {
+ # For ?curid=x urls, disallow indexing
+ return array(
+ 'index' => 'noindex',
+ 'follow' => 'follow'
+ );
+ }
+
+ # Otherwise, construct the policy based on the various config variables.
+ $policy = self::formatRobotPolicy( $wgDefaultRobotPolicy );
+
+ if ( isset( $wgNamespaceRobotPolicies[$ns] ) ) {
+ # Honour customised robot policies for this namespace
+ $policy = array_merge(
+ $policy,
+ self::formatRobotPolicy( $wgNamespaceRobotPolicies[$ns] )
+ );
+ }
+ if ( $this->getTitle()->canUseNoindex() && is_object( $pOutput ) && $pOutput->getIndexPolicy() ) {
+ # __INDEX__ and __NOINDEX__ magic words, if allowed. Incorporates
+ # a final sanity check that we have really got the parser output.
+ $policy = array_merge(
+ $policy,
+ array( 'index' => $pOutput->getIndexPolicy() )
+ );
+ }
+
+ if ( isset( $wgArticleRobotPolicies[$this->getTitle()->getPrefixedText()] ) ) {
+ # (bug 14900) site config can override user-defined __INDEX__ or __NOINDEX__
+ $policy = array_merge(
+ $policy,
+ self::formatRobotPolicy( $wgArticleRobotPolicies[$this->getTitle()->getPrefixedText()] )
+ );
+ }
+
+ return $policy;
+ }
+
+ /**
+ * Converts a String robot policy into an associative array, to allow
+ * merging of several policies using array_merge().
+ * @param array|string $policy Returns empty array on null/false/'', transparent
+ * to already-converted arrays, converts string.
+ * @return array 'index' => \<indexpolicy\>, 'follow' => \<followpolicy\>
+ */
+ public static function formatRobotPolicy( $policy ) {
+ if ( is_array( $policy ) ) {
+ return $policy;
+ } elseif ( !$policy ) {
+ return array();
+ }
+
+ $policy = explode( ',', $policy );
+ $policy = array_map( 'trim', $policy );
+
+ $arr = array();
+ foreach ( $policy as $var ) {
+ if ( in_array( $var, array( 'index', 'noindex' ) ) ) {
+ $arr['index'] = $var;
+ } elseif ( in_array( $var, array( 'follow', 'nofollow' ) ) ) {
+ $arr['follow'] = $var;
+ }
+ }
+
+ return $arr;
+ }
+
+ /**
+ * If this request is a redirect view, send "redirected from" subtitle to
+ * the output. Returns true if the header was needed, false if this is not
+ * a redirect view. Handles both local and remote redirects.
+ *
+ * @return bool
+ */
+ public function showRedirectedFromHeader() {
+ global $wgRedirectSources;
+ $outputPage = $this->getContext()->getOutput();
+
+ $rdfrom = $this->getContext()->getRequest()->getVal( 'rdfrom' );
+
+ if ( isset( $this->mRedirectedFrom ) ) {
+ // This is an internally redirected page view.
+ // We'll need a backlink to the source page for navigation.
+ if ( wfRunHooks( 'ArticleViewRedirect', array( &$this ) ) ) {
+ $redir = Linker::linkKnown(
+ $this->mRedirectedFrom,
+ null,
+ array(),
+ array( 'redirect' => 'no' )
+ );
+
+ $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
+
+ // Set the fragment if one was specified in the redirect
+ if ( $this->getTitle()->hasFragment() ) {
+ $outputPage->addJsConfigVars( 'wgRedirectToFragment', $this->getTitle()->getFragmentForURL() );
+ $outputPage->addModules( 'mediawiki.action.view.redirectToFragment' );
+ }
+
+ // Add a <link rel="canonical"> tag
+ $outputPage->setCanonicalUrl( $this->getTitle()->getLocalURL() );
+
+ // Tell the output object that the user arrived at this article through a redirect
+ $outputPage->setRedirectedFrom( $this->mRedirectedFrom );
+
+ return true;
+ }
+ } elseif ( $rdfrom ) {
+ // This is an externally redirected view, from some other wiki.
+ // If it was reported from a trusted site, supply a backlink.
+ if ( $wgRedirectSources && preg_match( $wgRedirectSources, $rdfrom ) ) {
+ $redir = Linker::makeExternalLink( $rdfrom, $rdfrom );
+ $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Show a header specific to the namespace currently being viewed, like
+ * [[MediaWiki:Talkpagetext]]. For Article::view().
+ */
+ public function showNamespaceHeader() {
+ if ( $this->getTitle()->isTalkPage() ) {
+ if ( !wfMessage( 'talkpageheader' )->isDisabled() ) {
+ $this->getContext()->getOutput()->wrapWikiMsg(
+ "<div class=\"mw-talkpageheader\">\n$1\n</div>",
+ array( 'talkpageheader' )
+ );
+ }
+ }
+ }
+
+ /**
+ * Show the footer section of an ordinary page view
+ */
+ public function showViewFooter() {
+ # check if we're displaying a [[User talk:x.x.x.x]] anonymous talk page
+ if ( $this->getTitle()->getNamespace() == NS_USER_TALK
+ && IP::isValid( $this->getTitle()->getText() )
+ ) {
+ $this->getContext()->getOutput()->addWikiMsg( 'anontalkpagetext' );
+ }
+
+ // Show a footer allowing the user to patrol the shown revision or page if possible
+ $patrolFooterShown = $this->showPatrolFooter();
+
+ wfRunHooks( 'ArticleViewFooter', array( $this, $patrolFooterShown ) );
+ }
+
+ /**
+ * If patrol is possible, output a patrol UI box. This is called from the
+ * footer section of ordinary page views. If patrol is not possible or not
+ * desired, does nothing.
+ * Side effect: When the patrol link is build, this method will call
+ * OutputPage::preventClickjacking() and load mediawiki.page.patrol.ajax.
+ *
+ * @return bool
+ */
+ public function showPatrolFooter() {
+ global $wgUseNPPatrol, $wgUseRCPatrol, $wgEnableAPI, $wgEnableWriteAPI;
+
+ $outputPage = $this->getContext()->getOutput();
+ $user = $this->getContext()->getUser();
+ $cache = wfGetMainCache();
+ $rc = false;
+
+ if ( !$this->getTitle()->quickUserCan( 'patrol', $user )
+ || !( $wgUseRCPatrol || $wgUseNPPatrol )
+ ) {
+ // Patrolling is disabled or the user isn't allowed to
+ return false;
+ }
+
+ wfProfileIn( __METHOD__ );
+
+ // New page patrol: Get the timestamp of the oldest revison which
+ // the revision table holds for the given page. Then we look
+ // whether it's within the RC lifespan and if it is, we try
+ // to get the recentchanges row belonging to that entry
+ // (with rc_new = 1).
+
+ // Check for cached results
+ if ( $cache->get( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ) ) ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
+ if ( $this->mRevision
+ && !RecentChange::isInRCLifespan( $this->mRevision->getTimestamp(), 21600 )
+ ) {
+ // The current revision is already older than what could be in the RC table
+ // 6h tolerance because the RC might not be cleaned out regularly
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
+ $dbr = wfGetDB( DB_SLAVE );
+ $oldestRevisionTimestamp = $dbr->selectField(
+ 'revision',
+ 'MIN( rev_timestamp )',
+ array( 'rev_page' => $this->getTitle()->getArticleID() ),
+ __METHOD__
+ );
+
+ if ( $oldestRevisionTimestamp
+ && RecentChange::isInRCLifespan( $oldestRevisionTimestamp, 21600 )
+ ) {
+ // 6h tolerance because the RC might not be cleaned out regularly
+ $rc = RecentChange::newFromConds(
+ array(
+ 'rc_new' => 1,
+ 'rc_timestamp' => $oldestRevisionTimestamp,
+ 'rc_namespace' => $this->getTitle()->getNamespace(),
+ 'rc_cur_id' => $this->getTitle()->getArticleID(),
+ 'rc_patrolled' => 0
+ ),
+ __METHOD__,
+ array( 'USE INDEX' => 'new_name_timestamp' )
+ );
+ }
+
+ if ( !$rc ) {
+ // No RC entry around
+
+ // Cache the information we gathered above in case we can't patrol
+ // Don't cache in case we can patrol as this could change
+ $cache->set( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ), '1' );
+
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
+ if ( $rc->getPerformer()->getName() == $user->getName() ) {
+ // Don't show a patrol link for own creations. If the user could
+ // patrol them, they already would be patrolled
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
+ $rcid = $rc->getAttribute( 'rc_id' );
+
+ $token = $user->getEditToken( $rcid );
+
+ $outputPage->preventClickjacking();
+ if ( $wgEnableAPI && $wgEnableWriteAPI && $user->isAllowed( 'writeapi' ) ) {
+ $outputPage->addModules( 'mediawiki.page.patrol.ajax' );
+ }
+
+ $link = Linker::linkKnown(
+ $this->getTitle(),
+ wfMessage( 'markaspatrolledtext' )->escaped(),
+ array(),
+ array(
+ 'action' => 'markpatrolled',
+ 'rcid' => $rcid,
+ 'token' => $token,
+ )
+ );
+
+ $outputPage->addHTML(
+ "<div class='patrollink'>" .
+ wfMessage( 'markaspatrolledlink' )->rawParams( $link )->escaped() .
+ '</div>'
+ );
+
+ wfProfileOut( __METHOD__ );
+ return true;
+ }
+
+ /**
+ * Show the error text for a missing article. For articles in the MediaWiki
+ * namespace, show the default message text. To be called from Article::view().
+ */
+ public function showMissingArticle() {
+ global $wgSend404Code;
+ $outputPage = $this->getContext()->getOutput();
+ // Whether the page is a root user page of an existing user (but not a subpage)
+ $validUserPage = false;
+
+ # Show info in user (talk) namespace. Does the user exist? Is he blocked?
+ if ( $this->getTitle()->getNamespace() == NS_USER
+ || $this->getTitle()->getNamespace() == NS_USER_TALK
+ ) {
+ $parts = explode( '/', $this->getTitle()->getText() );
+ $rootPart = $parts[0];
+ $user = User::newFromName( $rootPart, false /* allow IP users*/ );
+ $ip = User::isIP( $rootPart );
+
+ if ( !( $user && $user->isLoggedIn() ) && !$ip ) { # User does not exist
+ $outputPage->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n\$1\n</div>",
+ array( 'userpage-userdoesnotexist-view', wfEscapeWikiText( $rootPart ) ) );
+ } elseif ( $user->isBlocked() ) { # Show log extract if the user is currently blocked
+ LogEventsList::showLogExtract(
+ $outputPage,
+ 'block',
+ $user->getUserPage(),
+ '',
+ array(
+ 'lim' => 1,
+ 'showIfEmpty' => false,
+ 'msgKey' => array(
+ 'blocked-notice-logextract',
+ $user->getName() # Support GENDER in notice
+ )
+ )
+ );
+ $validUserPage = !$this->getTitle()->isSubpage();
+ } else {
+ $validUserPage = !$this->getTitle()->isSubpage();
+ }
+ }
+
+ wfRunHooks( 'ShowMissingArticle', array( $this ) );
+
+ // Give extensions a chance to hide their (unrelated) log entries
+ $logTypes = array( 'delete', 'move' );
+ $conds = array( "log_action != 'revision'" );
+ wfRunHooks( 'Article::MissingArticleConditions', array( &$conds, $logTypes ) );
+
+ # Show delete and move logs
+ LogEventsList::showLogExtract( $outputPage, $logTypes, $this->getTitle(), '',
+ array( 'lim' => 10,
+ 'conds' => $conds,
+ 'showIfEmpty' => false,
+ 'msgKey' => array( 'moveddeleted-notice' ) )
+ );
+
+ if ( !$this->mPage->hasViewableContent() && $wgSend404Code && !$validUserPage ) {
+ // If there's no backing content, send a 404 Not Found
+ // for better machine handling of broken links.
+ $this->getContext()->getRequest()->response()->header( "HTTP/1.1 404 Not Found" );
+ }
+
+ if ( $validUserPage ) {
+ // Also apply the robot policy for nonexisting user pages (as those aren't served as 404)
+ $policy = $this->getRobotPolicy( 'view' );
+ $outputPage->setIndexPolicy( $policy['index'] );
+ $outputPage->setFollowPolicy( $policy['follow'] );
+ }
+
+ $hookResult = wfRunHooks( 'BeforeDisplayNoArticleText', array( $this ) );
+
+ if ( ! $hookResult ) {
+ return;
+ }
+
+ # Show error message
+ $oldid = $this->getOldID();
+ if ( $oldid ) {
+ $text = wfMessage( 'missing-revision', $oldid )->plain();
+ } elseif ( $this->getTitle()->getNamespace() === NS_MEDIAWIKI ) {
+ // Use the default message text
+ $text = $this->getTitle()->getDefaultMessageText();
+ } elseif ( $this->getTitle()->quickUserCan( 'create', $this->getContext()->getUser() )
+ && $this->getTitle()->quickUserCan( 'edit', $this->getContext()->getUser() )
+ ) {
+ $message = $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon';
+ $text = wfMessage( $message )->plain();
+ } else {
+ $text = wfMessage( 'noarticletext-nopermission' )->plain();
+ }
+ $text = "<div class='noarticletext'>\n$text\n</div>";
+
+ $outputPage->addWikiText( $text );
+ }
+
+ /**
+ * If the revision requested for view is deleted, check permissions.
+ * Send either an error message or a warning header to the output.
+ *
+ * @return bool true if the view is allowed, false if not.
+ */
+ public function showDeletedRevisionHeader() {
+ if ( !$this->mRevision->isDeleted( Revision::DELETED_TEXT ) ) {
+ // Not deleted
+ return true;
+ }
+
+ $outputPage = $this->getContext()->getOutput();
+ $user = $this->getContext()->getUser();
+ // If the user is not allowed to see it...
+ if ( !$this->mRevision->userCan( Revision::DELETED_TEXT, $user ) ) {
+ $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+ 'rev-deleted-text-permission' );
+
+ return false;
+ // If the user needs to confirm that they want to see it...
+ } elseif ( $this->getContext()->getRequest()->getInt( 'unhide' ) != 1 ) {
+ # Give explanation and add a link to view the revision...
+ $oldid = intval( $this->getOldID() );
+ $link = $this->getTitle()->getFullURL( "oldid={$oldid}&unhide=1" );
+ $msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
+ 'rev-suppressed-text-unhide' : 'rev-deleted-text-unhide';
+ $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+ array( $msg, $link ) );
+
+ return false;
+ // We are allowed to see...
+ } else {
+ $msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
+ 'rev-suppressed-text-view' : 'rev-deleted-text-view';
+ $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", $msg );
+
+ return true;
+ }
+ }
+
+ /**
+ * Generate the navigation links when browsing through an article revisions
+ * It shows the information as:
+ * Revision as of \<date\>; view current revision
+ * \<- Previous version | Next Version -\>
+ *
+ * @param int $oldid Revision ID of this article revision
+ */
+ public function setOldSubtitle( $oldid = 0 ) {
+ if ( !wfRunHooks( 'DisplayOldSubtitle', array( &$this, &$oldid ) ) ) {
+ return;
+ }
+
+ $unhide = $this->getContext()->getRequest()->getInt( 'unhide' ) == 1;
+
+ # Cascade unhide param in links for easy deletion browsing
+ $extraParams = array();
+ if ( $unhide ) {
+ $extraParams['unhide'] = 1;
+ }
+
+ if ( $this->mRevision && $this->mRevision->getId() === $oldid ) {
+ $revision = $this->mRevision;
+ } else {
+ $revision = Revision::newFromId( $oldid );
+ }
+
+ $timestamp = $revision->getTimestamp();
+
+ $current = ( $oldid == $this->mPage->getLatest() );
+ $language = $this->getContext()->getLanguage();
+ $user = $this->getContext()->getUser();
+
+ $td = $language->userTimeAndDate( $timestamp, $user );
+ $tddate = $language->userDate( $timestamp, $user );
+ $tdtime = $language->userTime( $timestamp, $user );
+
+ # Show user links if allowed to see them. If hidden, then show them only if requested...
+ $userlinks = Linker::revUserTools( $revision, !$unhide );
+
+ $infomsg = $current && !wfMessage( 'revision-info-current' )->isDisabled()
+ ? 'revision-info-current'
+ : 'revision-info';
+
+ $outputPage = $this->getContext()->getOutput();
+ $outputPage->addSubtitle( "<div id=\"mw-{$infomsg}\">" . wfMessage( $infomsg,
+ $td )->rawParams( $userlinks )->params( $revision->getID(), $tddate,
+ $tdtime, $revision->getUserText() )->rawParams( Linker::revComment( $revision, true, true ) )->parse() . "</div>" );
+
+ $lnk = $current
+ ? wfMessage( 'currentrevisionlink' )->escaped()
+ : Linker::linkKnown(
+ $this->getTitle(),
+ wfMessage( 'currentrevisionlink' )->escaped(),
+ array(),
+ $extraParams
+ );
+ $curdiff = $current
+ ? wfMessage( 'diff' )->escaped()
+ : Linker::linkKnown(
+ $this->getTitle(),
+ wfMessage( 'diff' )->escaped(),
+ array(),
+ array(
+ 'diff' => 'cur',
+ 'oldid' => $oldid
+ ) + $extraParams
+ );
+ $prev = $this->getTitle()->getPreviousRevisionID( $oldid );
+ $prevlink = $prev
+ ? Linker::linkKnown(
+ $this->getTitle(),
+ wfMessage( 'previousrevision' )->escaped(),
+ array(),
+ array(
+ 'direction' => 'prev',
+ 'oldid' => $oldid
+ ) + $extraParams
+ )
+ : wfMessage( 'previousrevision' )->escaped();
+ $prevdiff = $prev
+ ? Linker::linkKnown(
+ $this->getTitle(),
+ wfMessage( 'diff' )->escaped(),
+ array(),
+ array(
+ 'diff' => 'prev',
+ 'oldid' => $oldid
+ ) + $extraParams
+ )
+ : wfMessage( 'diff' )->escaped();
+ $nextlink = $current
+ ? wfMessage( 'nextrevision' )->escaped()
+ : Linker::linkKnown(
+ $this->getTitle(),
+ wfMessage( 'nextrevision' )->escaped(),
+ array(),
+ array(
+ 'direction' => 'next',
+ 'oldid' => $oldid
+ ) + $extraParams
+ );
+ $nextdiff = $current
+ ? wfMessage( 'diff' )->escaped()
+ : Linker::linkKnown(
+ $this->getTitle(),
+ wfMessage( 'diff' )->escaped(),
+ array(),
+ array(
+ 'diff' => 'next',
+ 'oldid' => $oldid
+ ) + $extraParams
+ );
+
+ $cdel = Linker::getRevDeleteLink( $user, $revision, $this->getTitle() );
+ if ( $cdel !== '' ) {
+ $cdel .= ' ';
+ }
+
+ $outputPage->addSubtitle( "<div id=\"mw-revision-nav\">" . $cdel .
+ wfMessage( 'revision-nav' )->rawParams(
+ $prevdiff, $prevlink, $lnk, $curdiff, $nextlink, $nextdiff
+ )->escaped() . "</div>" );
+ }
+
+ /**
+ * Return the HTML for the top of a redirect page
+ *
+ * Chances are you should just be using the ParserOutput from
+ * WikitextContent::getParserOutput instead of calling this for redirects.
+ *
+ * @param Title|array $target Destination(s) to redirect
+ * @param bool $appendSubtitle [optional]
+ * @param bool $forceKnown Should the image be shown as a bluelink regardless of existence?
+ * @return string Containing HMTL with redirect link
+ */
+ public function viewRedirect( $target, $appendSubtitle = true, $forceKnown = false ) {
+ $lang = $this->getTitle()->getPageLanguage();
+ if ( $appendSubtitle ) {
+ $out = $this->getContext()->getOutput();
+ $out->addSubtitle( wfMessage( 'redirectpagesub' )->parse() );
+ }
+ return static::getRedirectHeaderHtml( $lang, $target, $forceKnown );
+ }
+
+ /**
+ * Return the HTML for the top of a redirect page
+ *
+ * Chances are you should just be using the ParserOutput from
+ * WikitextContent::getParserOutput instead of calling this for redirects.
+ *
+ * @since 1.23
+ * @param Language $lang
+ * @param Title|array $target Destination(s) to redirect
+ * @param bool $forceKnown Should the image be shown as a bluelink regardless of existence?
+ * @return string Containing HMTL with redirect link
+ */
+ public static function getRedirectHeaderHtml( Language $lang, $target, $forceKnown = false ) {
+ global $wgStylePath;
+
+ if ( !is_array( $target ) ) {
+ $target = array( $target );
+ }
+
+ $imageDir = $lang->getDir();
+
+ // the loop prepends the arrow image before the link, so the first case needs to be outside
+
+ /** @var $title Title */
+ $title = array_shift( $target );
+
+ if ( $forceKnown ) {
+ $link = Linker::linkKnown( $title, htmlspecialchars( $title->getFullText() ) );
+ } else {
+ $link = Linker::link( $title, htmlspecialchars( $title->getFullText() ) );
+ }
+
+ $nextRedirect = $wgStylePath . '/common/images/nextredirect' . $imageDir . '.png';
+ $alt = $lang->isRTL() ? '←' : '→';
+
+ // Automatically append redirect=no to each link, since most of them are
+ // redirect pages themselves.
+ /** @var Title $rt */
+ foreach ( $target as $rt ) {
+ $link .= Html::element( 'img', array( 'src' => $nextRedirect, 'alt' => $alt ) );
+ if ( $forceKnown ) {
+ $link .= Linker::linkKnown(
+ $rt,
+ htmlspecialchars( $rt->getFullText(),
+ array(),
+ array( 'redirect' => 'no' )
+ )
+ );
+ } else {
+ $link .= Linker::link(
+ $rt,
+ htmlspecialchars( $rt->getFullText() ),
+ array(),
+ array( 'redirect' => 'no' )
+ );
+ }
+ }
+
+ $imageUrl = $wgStylePath . '/common/images/redirect' . $imageDir . '.png';
+ return '<div class="redirectMsg">' .
+ Html::element( 'img', array( 'src' => $imageUrl, 'alt' => '#REDIRECT' ) ) .
+ '<span class="redirectText">' . $link . '</span></div>';
+ }
+
+ /**
+ * Handle action=render
+ */
+ public function render() {
+ $this->getContext()->getRequest()->response()->header( 'X-Robots-Tag: noindex' );
+ $this->getContext()->getOutput()->setArticleBodyOnly( true );
+ $this->getContext()->getOutput()->enableSectionEditLinks( false );
+ $this->view();
+ }
+
+ /**
+ * action=protect handler
+ */
+ public function protect() {
+ $form = new ProtectionForm( $this );
+ $form->execute();
+ }
+
+ /**
+ * action=unprotect handler (alias)
+ */
+ public function unprotect() {
+ $this->protect();
+ }
+
+ /**
+ * UI entry point for page deletion
+ */
+ public function delete() {
+ # This code desperately needs to be totally rewritten
+
+ $title = $this->getTitle();
+ $user = $this->getContext()->getUser();
+
+ # Check permissions
+ $permission_errors = $title->getUserPermissionsErrors( 'delete', $user );
+ if ( count( $permission_errors ) ) {
+ throw new PermissionsError( 'delete', $permission_errors );
+ }
+
+ # Read-only check...
+ if ( wfReadOnly() ) {
+ throw new ReadOnlyError;
+ }
+
+ # Better double-check that it hasn't been deleted yet!
+ $this->mPage->loadPageData( 'fromdbmaster' );
+ if ( !$this->mPage->exists() ) {
+ $deleteLogPage = new LogPage( 'delete' );
+ $outputPage = $this->getContext()->getOutput();
+ $outputPage->setPageTitle( wfMessage( 'cannotdelete-title', $title->getPrefixedText() ) );
+ $outputPage->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
+ array( 'cannotdelete', wfEscapeWikiText( $title->getPrefixedText() ) )
+ );
+ $outputPage->addHTML(
+ Xml::element( 'h2', null, $deleteLogPage->getName()->text() )
+ );
+ LogEventsList::showLogExtract(
+ $outputPage,
+ 'delete',
+ $title
+ );
+
+ return;
+ }
+
+ $request = $this->getContext()->getRequest();
+ $deleteReasonList = $request->getText( 'wpDeleteReasonList', 'other' );
+ $deleteReason = $request->getText( 'wpReason' );
+
+ if ( $deleteReasonList == 'other' ) {
+ $reason = $deleteReason;
+ } elseif ( $deleteReason != '' ) {
+ // Entry from drop down menu + additional comment
+ $colonseparator = wfMessage( 'colon-separator' )->inContentLanguage()->text();
+ $reason = $deleteReasonList . $colonseparator . $deleteReason;
+ } else {
+ $reason = $deleteReasonList;
+ }
+
+ if ( $request->wasPosted() && $user->matchEditToken( $request->getVal( 'wpEditToken' ),
+ array( 'delete', $this->getTitle()->getPrefixedText() ) )
+ ) {
+ # Flag to hide all contents of the archived revisions
+ $suppress = $request->getVal( 'wpSuppress' ) && $user->isAllowed( 'suppressrevision' );
+
+ $this->doDelete( $reason, $suppress );
+
+ WatchAction::doWatchOrUnwatch( $request->getCheck( 'wpWatch' ), $title, $user );
+
+ return;
+ }
+
+ // Generate deletion reason
+ $hasHistory = false;
+ if ( !$reason ) {
+ try {
+ $reason = $this->generateReason( $hasHistory );
+ } catch ( MWException $e ) {
+ # if a page is horribly broken, we still want to be able to
+ # delete it. So be lenient about errors here.
+ wfDebug( "Error while building auto delete summary: $e" );
+ $reason = '';
+ }
+ }
+
+ // If the page has a history, insert a warning
+ if ( $hasHistory ) {
+ $revisions = $this->mTitle->estimateRevisionCount();
+ // @todo FIXME: i18n issue/patchwork message
+ $this->getContext()->getOutput()->addHTML( '<strong class="mw-delete-warning-revisions">' .
+ wfMessage( 'historywarning' )->numParams( $revisions )->parse() .
+ wfMessage( 'word-separator' )->plain() . Linker::linkKnown( $title,
+ wfMessage( 'history' )->escaped(),
+ array( 'rel' => 'archives' ),
+ array( 'action' => 'history' ) ) .
+ '</strong>'
+ );
+
+ if ( $this->mTitle->isBigDeletion() ) {
+ global $wgDeleteRevisionsLimit;
+ $this->getContext()->getOutput()->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
+ array(
+ 'delete-warning-toobig',
+ $this->getContext()->getLanguage()->formatNum( $wgDeleteRevisionsLimit )
+ )
+ );
+ }
+ }
+
+ $this->confirmDelete( $reason );
+ }
+
+ /**
+ * Output deletion confirmation dialog
+ * @todo FIXME: Move to another file?
+ * @param string $reason Prefilled reason
+ */
+ public function confirmDelete( $reason ) {
+ wfDebug( "Article::confirmDelete\n" );
+
+ $outputPage = $this->getContext()->getOutput();
+ $outputPage->setPageTitle( wfMessage( 'delete-confirm', $this->getTitle()->getPrefixedText() ) );
+ $outputPage->addBacklinkSubtitle( $this->getTitle() );
+ $outputPage->setRobotPolicy( 'noindex,nofollow' );
+ $backlinkCache = $this->getTitle()->getBacklinkCache();
+ if ( $backlinkCache->hasLinks( 'pagelinks' ) || $backlinkCache->hasLinks( 'templatelinks' ) ) {
+ $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+ 'deleting-backlinks-warning' );
+ }
+ $outputPage->addWikiMsg( 'confirmdeletetext' );
+
+ wfRunHooks( 'ArticleConfirmDelete', array( $this, $outputPage, &$reason ) );
+
+ $user = $this->getContext()->getUser();
+
+ if ( $user->isAllowed( 'suppressrevision' ) ) {
+ $suppress = "<tr id=\"wpDeleteSuppressRow\">
+ <td></td>
+ <td class='mw-input'><strong>" .
+ Xml::checkLabel( wfMessage( 'revdelete-suppress' )->text(),
+ 'wpSuppress', 'wpSuppress', false, array( 'tabindex' => '4' ) ) .
+ "</strong></td>
+ </tr>";
+ } else {
+ $suppress = '';
+ }
+ $checkWatch = $user->getBoolOption( 'watchdeletion' ) || $user->isWatched( $this->getTitle() );
+
+ $form = Xml::openElement( 'form', array( 'method' => 'post',
+ 'action' => $this->getTitle()->getLocalURL( 'action=delete' ), 'id' => 'deleteconfirm' ) ) .
+ Xml::openElement( 'fieldset', array( 'id' => 'mw-delete-table' ) ) .
+ Xml::tags( 'legend', null, wfMessage( 'delete-legend' )->escaped() ) .
+ Xml::openElement( 'table', array( 'id' => 'mw-deleteconfirm-table' ) ) .
+ "<tr id=\"wpDeleteReasonListRow\">
+ <td class='mw-label'>" .
+ Xml::label( wfMessage( 'deletecomment' )->text(), 'wpDeleteReasonList' ) .
+ "</td>
+ <td class='mw-input'>" .
+ Xml::listDropDown(
+ 'wpDeleteReasonList',
+ wfMessage( 'deletereason-dropdown' )->inContentLanguage()->text(),
+ wfMessage( 'deletereasonotherlist' )->inContentLanguage()->text(),
+ '',
+ 'wpReasonDropDown',
+ 1
+ ) .
+ "</td>
+ </tr>
+ <tr id=\"wpDeleteReasonRow\">
+ <td class='mw-label'>" .
+ Xml::label( wfMessage( 'deleteotherreason' )->text(), 'wpReason' ) .
+ "</td>
+ <td class='mw-input'>" .
+ Html::input( 'wpReason', $reason, 'text', array(
+ 'size' => '60',
+ 'maxlength' => '255',
+ 'tabindex' => '2',
+ 'id' => 'wpReason',
+ 'autofocus'
+ ) ) .
+ "</td>
+ </tr>";
+
+ # Disallow watching if user is not logged in
+ if ( $user->isLoggedIn() ) {
+ $form .= "
+ <tr>
+ <td></td>
+ <td class='mw-input'>" .
+ Xml::checkLabel( wfMessage( 'watchthis' )->text(),
+ 'wpWatch', 'wpWatch', $checkWatch, array( 'tabindex' => '3' ) ) .
+ "</td>
+ </tr>";
+ }
+
+ $form .= "
+ $suppress
+ <tr>
+ <td></td>
+ <td class='mw-submit'>" .
+ Xml::submitButton( wfMessage( 'deletepage' )->text(),
+ array( 'name' => 'wpConfirmB', 'id' => 'wpConfirmB', 'tabindex' => '5' ) ) .
+ "</td>
+ </tr>" .
+ Xml::closeElement( 'table' ) .
+ Xml::closeElement( 'fieldset' ) .
+ Html::hidden(
+ 'wpEditToken',
+ $user->getEditToken( array( 'delete', $this->getTitle()->getPrefixedText() ) )
+ ) .
+ Xml::closeElement( 'form' );
+
+ if ( $user->isAllowed( 'editinterface' ) ) {
+ $title = Title::makeTitle( NS_MEDIAWIKI, 'Deletereason-dropdown' );
+ $link = Linker::link(
+ $title,
+ wfMessage( 'delete-edit-reasonlist' )->escaped(),
+ array(),
+ array( 'action' => 'edit' )
+ );
+ $form .= '<p class="mw-delete-editreasons">' . $link . '</p>';
+ }
+
+ $outputPage->addHTML( $form );
+
+ $deleteLogPage = new LogPage( 'delete' );
+ $outputPage->addHTML( Xml::element( 'h2', null, $deleteLogPage->getName()->text() ) );
+ LogEventsList::showLogExtract( $outputPage, 'delete',
+ $this->getTitle()
+ );
+ }
+
+ /**
+ * Perform a deletion and output success or failure messages
+ * @param string $reason
+ * @param bool $suppress
+ */
+ public function doDelete( $reason, $suppress = false ) {
+ $error = '';
+ $outputPage = $this->getContext()->getOutput();
+ $status = $this->mPage->doDeleteArticleReal( $reason, $suppress, 0, true, $error );
+
+ if ( $status->isGood() ) {
+ $deleted = $this->getTitle()->getPrefixedText();
+
+ $outputPage->setPageTitle( wfMessage( 'actioncomplete' ) );
+ $outputPage->setRobotPolicy( 'noindex,nofollow' );
+
+ $loglink = '[[Special:Log/delete|' . wfMessage( 'deletionlog' )->text() . ']]';
+
+ $outputPage->addWikiMsg( 'deletedtext', wfEscapeWikiText( $deleted ), $loglink );
+ $outputPage->returnToMain( false );
+ } else {
+ $outputPage->setPageTitle(
+ wfMessage( 'cannotdelete-title',
+ $this->getTitle()->getPrefixedText() )
+ );
+
+ if ( $error == '' ) {
+ $outputPage->addWikiText(
+ "<div class=\"error mw-error-cannotdelete\">\n" . $status->getWikiText() . "\n</div>"
+ );
+ $deleteLogPage = new LogPage( 'delete' );
+ $outputPage->addHTML( Xml::element( 'h2', null, $deleteLogPage->getName()->text() ) );
+
+ LogEventsList::showLogExtract(
+ $outputPage,
+ 'delete',
+ $this->getTitle()
+ );
+ } else {
+ $outputPage->addHTML( $error );
+ }
+ }
+ }
+
+ /* Caching functions */
+
+ /**
+ * checkLastModified returns true if it has taken care of all
+ * output to the client that is necessary for this request.
+ * (that is, it has sent a cached version of the page)
+ *
+ * @return bool true if cached version send, false otherwise
+ */
+ protected function tryFileCache() {
+ static $called = false;
+
+ if ( $called ) {
+ wfDebug( "Article::tryFileCache(): called twice!?\n" );
+ return false;
+ }
+
+ $called = true;
+ if ( $this->isFileCacheable() ) {
+ $cache = HTMLFileCache::newFromTitle( $this->getTitle(), 'view' );
+ if ( $cache->isCacheGood( $this->mPage->getTouched() ) ) {
+ wfDebug( "Article::tryFileCache(): about to load file\n" );
+ $cache->loadFromFileCache( $this->getContext() );
+ return true;
+ } else {
+ wfDebug( "Article::tryFileCache(): starting buffer\n" );
+ ob_start( array( &$cache, 'saveToFileCache' ) );
+ }
+ } else {
+ wfDebug( "Article::tryFileCache(): not cacheable\n" );
+ }
+
+ return false;
+ }
+
+ /**
+ * Check if the page can be cached
+ * @return bool
+ */
+ public function isFileCacheable() {
+ $cacheable = false;
+
+ if ( HTMLFileCache::useFileCache( $this->getContext() ) ) {
+ $cacheable = $this->mPage->getID()
+ && !$this->mRedirectedFrom && !$this->getTitle()->isRedirect();
+ // Extension may have reason to disable file caching on some pages.
+ if ( $cacheable ) {
+ $cacheable = wfRunHooks( 'IsFileCacheable', array( &$this ) );
+ }
+ }
+
+ return $cacheable;
+ }
+
+ /**#@-*/
+
+ /**
+ * Lightweight method to get the parser output for a page, checking the parser cache
+ * and so on. Doesn't consider most of the stuff that WikiPage::view is forced to
+ * consider, so it's not appropriate to use there.
+ *
+ * @since 1.16 (r52326) for LiquidThreads
+ *
+ * @param int|null $oldid Revision ID or null
+ * @param User $user The relevant user
+ * @return ParserOutput|bool ParserOutput or false if the given revision ID is not found
+ */
+ public function getParserOutput( $oldid = null, User $user = null ) {
+ //XXX: bypasses mParserOptions and thus setParserOptions()
+
+ if ( $user === null ) {
+ $parserOptions = $this->getParserOptions();
+ } else {
+ $parserOptions = $this->mPage->makeParserOptions( $user );
+ }
+
+ return $this->mPage->getParserOutput( $parserOptions, $oldid );
+ }
+
+ /**
+ * Override the ParserOptions used to render the primary article wikitext.
+ *
+ * @param ParserOptions $options
+ * @throws MWException if the parser options where already initialized.
+ */
+ public function setParserOptions( ParserOptions $options ) {
+ if ( $this->mParserOptions ) {
+ throw new MWException( "can't change parser options after they have already been set" );
+ }
+
+ // clone, so if $options is modified later, it doesn't confuse the parser cache.
+ $this->mParserOptions = clone $options;
+ }
+
+ /**
+ * Get parser options suitable for rendering the primary article wikitext
+ * @return ParserOptions
+ */
+ public function getParserOptions() {
+ if ( !$this->mParserOptions ) {
+ $this->mParserOptions = $this->mPage->makeParserOptions( $this->getContext() );
+ }
+ // Clone to allow modifications of the return value without affecting cache
+ return clone $this->mParserOptions;
+ }
+
+ /**
+ * Sets the context this Article is executed in
+ *
+ * @param IContextSource $context
+ * @since 1.18
+ */
+ public function setContext( $context ) {
+ $this->mContext = $context;
+ }
+
+ /**
+ * Gets the context this Article is executed in
+ *
+ * @return IContextSource
+ * @since 1.18
+ */
+ public function getContext() {
+ if ( $this->mContext instanceof IContextSource ) {
+ return $this->mContext;
+ } else {
+ wfDebug( __METHOD__ . " called and \$mContext is null. " .
+ "Return RequestContext::getMain(); for sanity\n" );
+ return RequestContext::getMain();
+ }
+ }
+
+ /**
+ * Use PHP's magic __get handler to handle accessing of
+ * raw WikiPage fields for backwards compatibility.
+ *
+ * @param string $fname Field name
+ */
+ public function __get( $fname ) {
+ if ( property_exists( $this->mPage, $fname ) ) {
+ #wfWarn( "Access to raw $fname field " . __CLASS__ );
+ return $this->mPage->$fname;
+ }
+ trigger_error( 'Inaccessible property via __get(): ' . $fname, E_USER_NOTICE );
+ }
+
+ /**
+ * Use PHP's magic __set handler to handle setting of
+ * raw WikiPage fields for backwards compatibility.
+ *
+ * @param string $fname Field name
+ * @param mixed $fvalue New value
+ */
+ public function __set( $fname, $fvalue ) {
+ if ( property_exists( $this->mPage, $fname ) ) {
+ #wfWarn( "Access to raw $fname field of " . __CLASS__ );
+ $this->mPage->$fname = $fvalue;
+ // Note: extensions may want to toss on new fields
+ } elseif ( !in_array( $fname, array( 'mContext', 'mPage' ) ) ) {
+ $this->mPage->$fname = $fvalue;
+ } else {
+ trigger_error( 'Inaccessible property via __set(): ' . $fname, E_USER_NOTICE );
+ }
+ }
+
+ /**
+ * Use PHP's magic __call handler to transform instance calls to
+ * WikiPage functions for backwards compatibility.
+ *
+ * @param string $fname Name of called method
+ * @param array $args Arguments to the method
+ * @return mixed
+ */
+ public function __call( $fname, $args ) {
+ if ( is_callable( array( $this->mPage, $fname ) ) ) {
+ #wfWarn( "Call to " . __CLASS__ . "::$fname; please use WikiPage instead" );
+ return call_user_func_array( array( $this->mPage, $fname ), $args );
+ }
+ trigger_error( 'Inaccessible function via __call(): ' . $fname, E_USER_ERROR );
+ }
+
+ // ****** B/C functions to work-around PHP silliness with __call and references ****** //
+
+ /**
+ * @param array $limit
+ * @param array $expiry
+ * @param bool $cascade
+ * @param string $reason
+ * @param User $user
+ * @return Status
+ */
+ public function doUpdateRestrictions( array $limit, array $expiry, &$cascade,
+ $reason, User $user
+ ) {
+ return $this->mPage->doUpdateRestrictions( $limit, $expiry, $cascade, $reason, $user );
+ }
+
+ /**
+ * @param array $limit
+ * @param string $reason
+ * @param int $cascade
+ * @param array $expiry
+ * @return bool
+ */
+ public function updateRestrictions( $limit = array(), $reason = '',
+ &$cascade = 0, $expiry = array()
+ ) {
+ return $this->mPage->doUpdateRestrictions(
+ $limit,
+ $expiry,
+ $cascade,
+ $reason,
+ $this->getContext()->getUser()
+ );
+ }
+
+ /**
+ * @param string $reason
+ * @param bool $suppress
+ * @param int $id
+ * @param bool $commit
+ * @param string $error
+ * @return bool
+ */
+ public function doDeleteArticle( $reason, $suppress = false, $id = 0,
+ $commit = true, &$error = ''
+ ) {
+ return $this->mPage->doDeleteArticle( $reason, $suppress, $id, $commit, $error );
+ }
+
+ /**
+ * @param string $fromP
+ * @param string $summary
+ * @param string $token
+ * @param bool $bot
+ * @param array $resultDetails
+ * @param User|null $user
+ * @return array
+ */
+ public function doRollback( $fromP, $summary, $token, $bot, &$resultDetails, User $user = null ) {
+ $user = is_null( $user ) ? $this->getContext()->getUser() : $user;
+ return $this->mPage->doRollback( $fromP, $summary, $token, $bot, $resultDetails, $user );
+ }
+
+ /**
+ * @param string $fromP
+ * @param string $summary
+ * @param bool $bot
+ * @param array $resultDetails
+ * @param User|null $guser
+ * @return array
+ */
+ public function commitRollback( $fromP, $summary, $bot, &$resultDetails, User $guser = null ) {
+ $guser = is_null( $guser ) ? $this->getContext()->getUser() : $guser;
+ return $this->mPage->commitRollback( $fromP, $summary, $bot, $resultDetails, $guser );
+ }
+
+ /**
+ * @param bool $hasHistory
+ * @return mixed
+ */
+ public function generateReason( &$hasHistory ) {
+ $title = $this->mPage->getTitle();
+ $handler = ContentHandler::getForTitle( $title );
+ return $handler->getAutoDeleteReason( $title, $hasHistory );
+ }
+
+ // ****** B/C functions for static methods ( __callStatic is PHP>=5.3 ) ****** //
+
+ /**
+ * @return array
+ */
+ public static function selectFields() {
+ return WikiPage::selectFields();
+ }
+
+ /**
+ * @param Title $title
+ */
+ public static function onArticleCreate( $title ) {
+ WikiPage::onArticleCreate( $title );
+ }
+
+ /**
+ * @param Title $title
+ */
+ public static function onArticleDelete( $title ) {
+ WikiPage::onArticleDelete( $title );
+ }
+
+ /**
+ * @param Title $title
+ */
+ public static function onArticleEdit( $title ) {
+ WikiPage::onArticleEdit( $title );
+ }
+
+ /**
+ * @param string $oldtext
+ * @param string $newtext
+ * @param int $flags
+ * @return string
+ * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
+ */
+ public static function getAutosummary( $oldtext, $newtext, $flags ) {
+ return WikiPage::getAutosummary( $oldtext, $newtext, $flags );
+ }
+ // ******
+}
--- /dev/null
+<?php
+/**
+ * Special handling for category description pages.
+ * Modelled after ImagePage.php.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Special handling for category description pages, showing pages,
+ * subcategories and file that belong to the category
+ */
+class CategoryPage extends Article {
+ # Subclasses can change this to override the viewer class.
+ protected $mCategoryViewerClass = 'CategoryViewer';
+
+ /**
+ * @param Title $title
+ * @return WikiCategoryPage
+ */
+ protected function newPage( Title $title ) {
+ // Overload mPage with a category-specific page
+ return new WikiCategoryPage( $title );
+ }
+
+ /**
+ * Constructor from a page id
+ * @param int $id Article ID to load
+ * @return CategoryPage|null
+ */
+ public static function newFromID( $id ) {
+ $t = Title::newFromID( $id );
+ # @todo FIXME: Doesn't inherit right
+ return $t == null ? null : new self( $t );
+ # return $t == null ? null : new static( $t ); // PHP 5.3
+ }
+
+ function view() {
+ $request = $this->getContext()->getRequest();
+ $diff = $request->getVal( 'diff' );
+ $diffOnly = $request->getBool( 'diffonly',
+ $this->getContext()->getUser()->getOption( 'diffonly' ) );
+
+ if ( $diff !== null && $diffOnly ) {
+ parent::view();
+ return;
+ }
+
+ if ( !wfRunHooks( 'CategoryPageView', array( &$this ) ) ) {
+ return;
+ }
+
+ $title = $this->getTitle();
+ if ( NS_CATEGORY == $title->getNamespace() ) {
+ $this->openShowCategory();
+ }
+
+ parent::view();
+
+ if ( NS_CATEGORY == $title->getNamespace() ) {
+ $this->closeShowCategory();
+ }
+ }
+
+ function openShowCategory() {
+ # For overloading
+ }
+
+ function closeShowCategory() {
+ // Use these as defaults for back compat --catrope
+ $request = $this->getContext()->getRequest();
+ $oldFrom = $request->getVal( 'from' );
+ $oldUntil = $request->getVal( 'until' );
+
+ $reqArray = $request->getValues();
+
+ $from = $until = array();
+ foreach ( array( 'page', 'subcat', 'file' ) as $type ) {
+ $from[$type] = $request->getVal( "{$type}from", $oldFrom );
+ $until[$type] = $request->getVal( "{$type}until", $oldUntil );
+
+ // Do not want old-style from/until propagating in nav links.
+ if ( !isset( $reqArray["{$type}from"] ) && isset( $reqArray["from"] ) ) {
+ $reqArray["{$type}from"] = $reqArray["from"];
+ }
+ if ( !isset( $reqArray["{$type}to"] ) && isset( $reqArray["to"] ) ) {
+ $reqArray["{$type}to"] = $reqArray["to"];
+ }
+ }
+
+ unset( $reqArray["from"] );
+ unset( $reqArray["to"] );
+
+ $viewer = new $this->mCategoryViewerClass(
+ $this->getContext()->getTitle(),
+ $this->getContext(),
+ $from,
+ $until,
+ $reqArray
+ );
+ $this->getContext()->getOutput()->addHTML( $viewer->getHTML() );
+ }
+}
--- /dev/null
+<?php
+/**
+ * Special handling for file description pages.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Class for viewing MediaWiki file description pages
+ *
+ * @ingroup Media
+ */
+class ImagePage extends Article {
+ /** @var File */
+ private $displayImg;
+
+ /** @var FileRepo */
+ private $repo;
+
+ /** @var bool */
+ private $fileLoaded;
+
+ /** @var bool */
+ protected $mExtraDescription = false;
+
+ /**
+ * @param Title $title
+ * @return WikiFilePage
+ */
+ protected function newPage( Title $title ) {
+ // Overload mPage with a file-specific page
+ return new WikiFilePage( $title );
+ }
+
+ /**
+ * Constructor from a page id
+ * @param int $id Article ID to load
+ * @return ImagePage|null
+ */
+ public static function newFromID( $id ) {
+ $t = Title::newFromID( $id );
+ # @todo FIXME: Doesn't inherit right
+ return $t == null ? null : new self( $t );
+ # return $t == null ? null : new static( $t ); // PHP 5.3
+ }
+
+ /**
+ * @param File $file
+ * @return void
+ */
+ public function setFile( $file ) {
+ $this->mPage->setFile( $file );
+ $this->displayImg = $file;
+ $this->fileLoaded = true;
+ }
+
+ protected function loadFile() {
+ if ( $this->fileLoaded ) {
+ return;
+ }
+ $this->fileLoaded = true;
+
+ $this->displayImg = $img = false;
+ wfRunHooks( 'ImagePageFindFile', array( $this, &$img, &$this->displayImg ) );
+ if ( !$img ) { // not set by hook?
+ $img = wfFindFile( $this->getTitle() );
+ if ( !$img ) {
+ $img = wfLocalFile( $this->getTitle() );
+ }
+ }
+ $this->mPage->setFile( $img );
+ if ( !$this->displayImg ) { // not set by hook?
+ $this->displayImg = $img;
+ }
+ $this->repo = $img->getRepo();
+ }
+
+ /**
+ * Handler for action=render
+ * Include body text only; none of the image extras
+ */
+ public function render() {
+ $this->getContext()->getOutput()->setArticleBodyOnly( true );
+ parent::view();
+ }
+
+ public function view() {
+ global $wgShowEXIF;
+
+ $out = $this->getContext()->getOutput();
+ $request = $this->getContext()->getRequest();
+ $diff = $request->getVal( 'diff' );
+ $diffOnly = $request->getBool(
+ 'diffonly',
+ $this->getContext()->getUser()->getOption( 'diffonly' )
+ );
+
+ if ( $this->getTitle()->getNamespace() != NS_FILE || ( $diff !== null && $diffOnly ) ) {
+ parent::view();
+ return;
+ }
+
+ $this->loadFile();
+
+ if ( $this->getTitle()->getNamespace() == NS_FILE && $this->mPage->getFile()->getRedirected() ) {
+ if ( $this->getTitle()->getDBkey() == $this->mPage->getFile()->getName() || $diff !== null ) {
+ // mTitle is the same as the redirect target so ask Article
+ // to perform the redirect for us.
+ $request->setVal( 'diffonly', 'true' );
+ parent::view();
+ return;
+ } else {
+ // mTitle is not the same as the redirect target so it is
+ // probably the redirect page itself. Fake the redirect symbol
+ $out->setPageTitle( $this->getTitle()->getPrefixedText() );
+ $out->addHTML( $this->viewRedirect(
+ Title::makeTitle( NS_FILE, $this->mPage->getFile()->getName() ),
+ /* $appendSubtitle */ true,
+ /* $forceKnown */ true )
+ );
+ $this->mPage->doViewUpdates( $this->getContext()->getUser(), $this->getOldID() );
+ return;
+ }
+ }
+
+ if ( $wgShowEXIF && $this->displayImg->exists() ) {
+ // @todo FIXME: Bad interface, see note on MediaHandler::formatMetadata().
+ $formattedMetadata = $this->displayImg->formatMetadata();
+ $showmeta = $formattedMetadata !== false;
+ } else {
+ $showmeta = false;
+ }
+
+ if ( !$diff && $this->displayImg->exists() ) {
+ $out->addHTML( $this->showTOC( $showmeta ) );
+ }
+
+ if ( !$diff ) {
+ $this->openShowImage();
+ }
+
+ # No need to display noarticletext, we use our own message, output in openShowImage()
+ if ( $this->mPage->getID() ) {
+ # NS_FILE is in the user language, but this section (the actual wikitext)
+ # should be in page content language
+ $pageLang = $this->getTitle()->getPageViewLanguage();
+ $out->addHTML( Xml::openElement( 'div', array( 'id' => 'mw-imagepage-content',
+ 'lang' => $pageLang->getHtmlCode(), 'dir' => $pageLang->getDir(),
+ 'class' => 'mw-content-' . $pageLang->getDir() ) ) );
+
+ parent::view();
+
+ $out->addHTML( Xml::closeElement( 'div' ) );
+ } else {
+ # Just need to set the right headers
+ $out->setArticleFlag( true );
+ $out->setPageTitle( $this->getTitle()->getPrefixedText() );
+ $this->mPage->doViewUpdates( $this->getContext()->getUser(), $this->getOldID() );
+ }
+
+ # Show shared description, if needed
+ if ( $this->mExtraDescription ) {
+ $fol = wfMessage( 'shareddescriptionfollows' );
+ if ( !$fol->isDisabled() ) {
+ $out->addWikiText( $fol->plain() );
+ }
+ $out->addHTML( '<div id="shared-image-desc">' . $this->mExtraDescription . "</div>\n" );
+ }
+
+ $this->closeShowImage();
+ $this->imageHistory();
+ // TODO: Cleanup the following
+
+ $out->addHTML( Xml::element( 'h2',
+ array( 'id' => 'filelinks' ),
+ wfMessage( 'imagelinks' )->text() ) . "\n" );
+ $this->imageDupes();
+ # @todo FIXME: For some freaky reason, we can't redirect to foreign images.
+ # Yet we return metadata about the target. Definitely an issue in the FileRepo
+ $this->imageLinks();
+
+ # Allow extensions to add something after the image links
+ $html = '';
+ wfRunHooks( 'ImagePageAfterImageLinks', array( $this, &$html ) );
+ if ( $html ) {
+ $out->addHTML( $html );
+ }
+
+ if ( $showmeta ) {
+ $out->addHTML( Xml::element(
+ 'h2',
+ array( 'id' => 'metadata' ),
+ wfMessage( 'metadata' )->text() ) . "\n" );
+ $out->addWikiText( $this->makeMetadataTable( $formattedMetadata ) );
+ $out->addModules( array( 'mediawiki.action.view.metadata' ) );
+ }
+
+ // Add remote Filepage.css
+ if ( !$this->repo->isLocal() ) {
+ $css = $this->repo->getDescriptionStylesheetUrl();
+ if ( $css ) {
+ $out->addStyle( $css );
+ }
+ }
+ // always show the local local Filepage.css, bug 29277
+ $out->addModuleStyles( 'filepage' );
+ }
+
+ /**
+ * @return File
+ */
+ public function getDisplayedFile() {
+ $this->loadFile();
+ return $this->displayImg;
+ }
+
+ /**
+ * Create the TOC
+ *
+ * @param bool $metadata Whether or not to show the metadata link
+ * @return string
+ */
+ protected function showTOC( $metadata ) {
+ $r = array(
+ '<li><a href="#file">' . wfMessage( 'file-anchor-link' )->escaped() . '</a></li>',
+ '<li><a href="#filehistory">' . wfMessage( 'filehist' )->escaped() . '</a></li>',
+ '<li><a href="#filelinks">' . wfMessage( 'imagelinks' )->escaped() . '</a></li>',
+ );
+ if ( $metadata ) {
+ $r[] = '<li><a href="#metadata">' . wfMessage( 'metadata' )->escaped() . '</a></li>';
+ }
+
+ wfRunHooks( 'ImagePageShowTOC', array( $this, &$r ) );
+
+ return '<ul id="filetoc">' . implode( "\n", $r ) . '</ul>';
+ }
+
+ /**
+ * Make a table with metadata to be shown in the output page.
+ *
+ * @todo FIXME: Bad interface, see note on MediaHandler::formatMetadata().
+ *
+ * @param array $metadata The array containing the Exif data
+ * @return string The metadata table. This is treated as Wikitext (!)
+ */
+ protected function makeMetadataTable( $metadata ) {
+ $r = "<div class=\"mw-imagepage-section-metadata\">";
+ $r .= wfMessage( 'metadata-help' )->plain();
+ $r .= "<table id=\"mw_metadata\" class=\"mw_metadata\">\n";
+ foreach ( $metadata as $type => $stuff ) {
+ foreach ( $stuff as $v ) {
+ # @todo FIXME: Why is this using escapeId for a class?!
+ $class = Sanitizer::escapeId( $v['id'] );
+ if ( $type == 'collapsed' ) {
+ // Handled by mediawiki.action.view.metadata module
+ // and skins/common/shared.css.
+ $class .= ' collapsable';
+ }
+ $r .= "<tr class=\"$class\">\n";
+ $r .= "<th>{$v['name']}</th>\n";
+ $r .= "<td>{$v['value']}</td>\n</tr>";
+ }
+ }
+ $r .= "</table>\n</div>\n";
+ return $r;
+ }
+
+ /**
+ * Overloading Article's getContentObject method.
+ *
+ * Omit noarticletext if sharedupload; text will be fetched from the
+ * shared upload server if possible.
+ * @return string
+ */
+ public function getContentObject() {
+ $this->loadFile();
+ if ( $this->mPage->getFile() && !$this->mPage->getFile()->isLocal() && 0 == $this->getID() ) {
+ return null;
+ }
+ return parent::getContentObject();
+ }
+
+ protected function openShowImage() {
+ global $wgImageLimits, $wgEnableUploads, $wgSend404Code;
+
+ $this->loadFile();
+ $out = $this->getContext()->getOutput();
+ $user = $this->getContext()->getUser();
+ $lang = $this->getContext()->getLanguage();
+ $dirmark = $lang->getDirMarkEntity();
+ $request = $this->getContext()->getRequest();
+
+ $max = $this->getImageLimitsFromOption( $user, 'imagesize' );
+ $maxWidth = $max[0];
+ $maxHeight = $max[1];
+
+ if ( $this->displayImg->exists() ) {
+ # image
+ $page = $request->getIntOrNull( 'page' );
+ if ( is_null( $page ) ) {
+ $params = array();
+ $page = 1;
+ } else {
+ $params = array( 'page' => $page );
+ }
+
+ $renderLang = $request->getVal( 'lang' );
+ if ( !is_null( $renderLang ) ) {
+ $handler = $this->displayImg->getHandler();
+ if ( $handler && $handler->validateParam( 'lang', $renderLang ) ) {
+ $params['lang'] = $renderLang;
+ } else {
+ $renderLang = null;
+ }
+ }
+
+ $width_orig = $this->displayImg->getWidth( $page );
+ $width = $width_orig;
+ $height_orig = $this->displayImg->getHeight( $page );
+ $height = $height_orig;
+
+ $filename = wfEscapeWikiText( $this->displayImg->getName() );
+ $linktext = $filename;
+
+ wfRunHooks( 'ImageOpenShowImageInlineBefore', array( &$this, &$out ) );
+
+ if ( $this->displayImg->allowInlineDisplay() ) {
+ # image
+
+ # "Download high res version" link below the image
+ # $msgsize = wfMessage( 'file-info-size', $width_orig, $height_orig,
+ # Linker::formatSize( $this->displayImg->getSize() ), $mime )->escaped();
+ # We'll show a thumbnail of this image
+ if ( $width > $maxWidth || $height > $maxHeight ) {
+ # Calculate the thumbnail size.
+ # First case, the limiting factor is the width, not the height.
+ /** @todo // FIXME: Possible division by 0. bug 36911 */
+ if ( $width / $height >= $maxWidth / $maxHeight ) {
+ /** @todo // FIXME: Possible division by 0. bug 36911 */
+ $height = round( $height * $maxWidth / $width );
+ $width = $maxWidth;
+ # Note that $height <= $maxHeight now.
+ } else {
+ /** @todo // FIXME: Possible division by 0. bug 36911 */
+ $newwidth = floor( $width * $maxHeight / $height );
+ /** @todo // FIXME: Possible division by 0. bug 36911 */
+ $height = round( $height * $newwidth / $width );
+ $width = $newwidth;
+ # Note that $height <= $maxHeight now, but might not be identical
+ # because of rounding.
+ }
+ $linktext = wfMessage( 'show-big-image' )->escaped();
+ if ( $this->displayImg->getRepo()->canTransformVia404() ) {
+ $thumbSizes = $wgImageLimits;
+ // Also include the full sized resolution in the list, so
+ // that users know they can get it. This will link to the
+ // original file asset if mustRender() === false. In the case
+ // that we mustRender, some users have indicated that they would
+ // find it useful to have the full size image in the rendered
+ // image format.
+ $thumbSizes[] = array( $width_orig, $height_orig );
+ } else {
+ # Creating thumb links triggers thumbnail generation.
+ # Just generate the thumb for the current users prefs.
+ $thumbSizes = array( $this->getImageLimitsFromOption( $user, 'thumbsize' ) );
+ if ( !$this->displayImg->mustRender() ) {
+ // We can safely include a link to the "full-size" preview,
+ // without actually rendering.
+ $thumbSizes[] = array( $width_orig, $height_orig );
+ }
+ }
+ # Generate thumbnails or thumbnail links as needed...
+ $otherSizes = array();
+ foreach ( $thumbSizes as $size ) {
+ // We include a thumbnail size in the list, if it is
+ // less than or equal to the original size of the image
+ // asset ($width_orig/$height_orig). We also exclude
+ // the current thumbnail's size ($width/$height)
+ // since that is added to the message separately, so
+ // it can be denoted as the current size being shown.
+ if ( $size[0] <= $width_orig && $size[1] <= $height_orig
+ && $size[0] != $width && $size[1] != $height
+ ) {
+ $sizeLink = $this->makeSizeLink( $params, $size[0], $size[1] );
+ if ( $sizeLink ) {
+ $otherSizes[] = $sizeLink;
+ }
+ }
+ }
+ $otherSizes = array_unique( $otherSizes );
+ $msgsmall = '';
+ $sizeLinkBigImagePreview = $this->makeSizeLink( $params, $width, $height );
+ if ( $sizeLinkBigImagePreview ) {
+ $msgsmall .= wfMessage( 'show-big-image-preview' )->
+ rawParams( $sizeLinkBigImagePreview )->
+ parse();
+ }
+ if ( count( $otherSizes ) ) {
+ $msgsmall .= ' ' .
+ Html::rawElement( 'span', array( 'class' => 'mw-filepage-other-resolutions' ),
+ wfMessage( 'show-big-image-other' )->rawParams( $lang->pipeList( $otherSizes ) )->
+ params( count( $otherSizes ) )->parse()
+ );
+ }
+ } elseif ( $width == 0 && $height == 0 ) {
+ # Some sort of audio file that doesn't have dimensions
+ # Don't output a no hi res message for such a file
+ $msgsmall = '';
+ } elseif ( $this->displayImg->isVectorized() ) {
+ # For vectorized images, full size is just the frame size
+ $msgsmall = '';
+ } else {
+ # Image is small enough to show full size on image page
+ $msgsmall = wfMessage( 'file-nohires' )->parse();
+ }
+
+ $params['width'] = $width;
+ $params['height'] = $height;
+ $thumbnail = $this->displayImg->transform( $params );
+ Linker::processResponsiveImages( $this->displayImg, $thumbnail, $params );
+
+ $anchorclose = Html::rawElement(
+ 'div',
+ array( 'class' => 'mw-filepage-resolutioninfo' ),
+ $msgsmall
+ );
+
+ $isMulti = $this->displayImg->isMultipage() && $this->displayImg->pageCount() > 1;
+ if ( $isMulti ) {
+ $out->addModules( 'mediawiki.page.image.pagination' );
+ $out->addHTML( '<table class="multipageimage"><tr><td>' );
+ }
+
+ if ( $thumbnail ) {
+ $options = array(
+ 'alt' => $this->displayImg->getTitle()->getPrefixedText(),
+ 'file-link' => true,
+ );
+ $out->addHTML( '<div class="fullImageLink" id="file">' .
+ $thumbnail->toHtml( $options ) .
+ $anchorclose . "</div>\n" );
+ }
+
+ if ( $isMulti ) {
+ $count = $this->displayImg->pageCount();
+
+ if ( $page > 1 ) {
+ $label = $out->parse( wfMessage( 'imgmultipageprev' )->text(), false );
+ $link = Linker::linkKnown(
+ $this->getTitle(),
+ $label,
+ array(),
+ array( 'page' => $page - 1 )
+ );
+ $thumb1 = Linker::makeThumbLinkObj(
+ $this->getTitle(),
+ $this->displayImg,
+ $link,
+ $label,
+ 'none',
+ array( 'page' => $page - 1 )
+ );
+ } else {
+ $thumb1 = '';
+ }
+
+ if ( $page < $count ) {
+ $label = wfMessage( 'imgmultipagenext' )->text();
+ $link = Linker::linkKnown(
+ $this->getTitle(),
+ $label,
+ array(),
+ array( 'page' => $page + 1 )
+ );
+ $thumb2 = Linker::makeThumbLinkObj(
+ $this->getTitle(),
+ $this->displayImg,
+ $link,
+ $label,
+ 'none',
+ array( 'page' => $page + 1 )
+ );
+ } else {
+ $thumb2 = '';
+ }
+
+ global $wgScript;
+
+ $formParams = array(
+ 'name' => 'pageselector',
+ 'action' => $wgScript,
+ );
+ $options = array();
+ for ( $i = 1; $i <= $count; $i++ ) {
+ $options[] = Xml::option( $lang->formatNum( $i ), $i, $i == $page );
+ }
+ $select = Xml::tags( 'select',
+ array( 'id' => 'pageselector', 'name' => 'page' ),
+ implode( "\n", $options ) );
+
+ $out->addHTML(
+ '</td><td><div class="multipageimagenavbox">' .
+ Xml::openElement( 'form', $formParams ) .
+ Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
+ wfMessage( 'imgmultigoto' )->rawParams( $select )->parse() .
+ Xml::submitButton( wfMessage( 'imgmultigo' )->text() ) .
+ Xml::closeElement( 'form' ) .
+ "<hr />$thumb1\n$thumb2<br style=\"clear: both\" /></div></td></tr></table>"
+ );
+ }
+ } elseif ( $this->displayImg->isSafeFile() ) {
+ # if direct link is allowed but it's not a renderable image, show an icon.
+ $icon = $this->displayImg->iconThumb();
+
+ $out->addHTML( '<div class="fullImageLink" id="file">' .
+ $icon->toHtml( array( 'file-link' => true ) ) .
+ "</div>\n" );
+ }
+
+ $longDesc = wfMessage( 'parentheses', $this->displayImg->getLongDesc() )->text();
+
+ $medialink = "[[Media:$filename|$linktext]]";
+
+ if ( !$this->displayImg->isSafeFile() ) {
+ $warning = wfMessage( 'mediawarning' )->plain();
+ // dirmark is needed here to separate the file name, which
+ // most likely ends in Latin characters, from the description,
+ // which may begin with the file type. In RTL environment
+ // this will get messy.
+ // The dirmark, however, must not be immediately adjacent
+ // to the filename, because it can get copied with it.
+ // See bug 25277.
+ // @codingStandardsIgnoreStart Ignore long line
+ $out->addWikiText( <<<EOT
+<div class="fullMedia"><span class="dangerousLink">{$medialink}</span> $dirmark<span class="fileInfo">$longDesc</span></div>
+<div class="mediaWarning">$warning</div>
+EOT
+ );
+ // @codingStandardsIgnoreEnd
+ } else {
+ $out->addWikiText( <<<EOT
+<div class="fullMedia">{$medialink} {$dirmark}<span class="fileInfo">$longDesc</span>
+</div>
+EOT
+ );
+ }
+
+ $renderLangOptions = $this->displayImg->getAvailableLanguages();
+ if ( count( $renderLangOptions ) >= 1 ) {
+ $currentLanguage = $renderLang;
+ $defaultLang = $this->displayImg->getDefaultRenderLanguage();
+ if ( is_null( $currentLanguage ) ) {
+ $currentLanguage = $defaultLang;
+ }
+ $out->addHtml( $this->doRenderLangOpt( $renderLangOptions, $currentLanguage, $defaultLang ) );
+ }
+
+ // Add cannot animate thumbnail warning
+ if ( !$this->displayImg->canAnimateThumbIfAppropriate() ) {
+ // Include the extension so wiki admins can
+ // customize it on a per file-type basis
+ // (aka say things like use format X instead).
+ // additionally have a specific message for
+ // file-no-thumb-animation-gif
+ $ext = $this->displayImg->getExtension();
+ $noAnimMesg = wfMessageFallback(
+ 'file-no-thumb-animation-' . $ext,
+ 'file-no-thumb-animation'
+ )->plain();
+
+ $out->addWikiText( <<<EOT
+<div class="mw-noanimatethumb">{$noAnimMesg}</div>
+EOT
+ );
+ }
+
+ if ( !$this->displayImg->isLocal() ) {
+ $this->printSharedImageText();
+ }
+ } else {
+ # Image does not exist
+ if ( !$this->getID() ) {
+ # No article exists either
+ # Show deletion log to be consistent with normal articles
+ LogEventsList::showLogExtract(
+ $out,
+ array( 'delete', 'move' ),
+ $this->getTitle()->getPrefixedText(),
+ '',
+ array( 'lim' => 10,
+ 'conds' => array( "log_action != 'revision'" ),
+ 'showIfEmpty' => false,
+ 'msgKey' => array( 'moveddeleted-notice' )
+ )
+ );
+ }
+
+ if ( $wgEnableUploads && $user->isAllowed( 'upload' ) ) {
+ // Only show an upload link if the user can upload
+ $uploadTitle = SpecialPage::getTitleFor( 'Upload' );
+ $nofile = array(
+ 'filepage-nofile-link',
+ $uploadTitle->getFullURL( array( 'wpDestFile' => $this->mPage->getFile()->getName() ) )
+ );
+ } else {
+ $nofile = 'filepage-nofile';
+ }
+ // Note, if there is an image description page, but
+ // no image, then this setRobotPolicy is overridden
+ // by Article::View().
+ $out->setRobotPolicy( 'noindex,nofollow' );
+ $out->wrapWikiMsg( "<div id='mw-imagepage-nofile' class='plainlinks'>\n$1\n</div>", $nofile );
+ if ( !$this->getID() && $wgSend404Code ) {
+ // If there is no image, no shared image, and no description page,
+ // output a 404, to be consistent with articles.
+ $request->response()->header( 'HTTP/1.1 404 Not Found' );
+ }
+ }
+ $out->setFileVersion( $this->displayImg );
+ }
+
+ /**
+ * Creates an thumbnail of specified size and returns an HTML link to it
+ * @param array $params Scaler parameters
+ * @param int $width
+ * @param int $height
+ * @return string
+ */
+ private function makeSizeLink( $params, $width, $height ) {
+ $params['width'] = $width;
+ $params['height'] = $height;
+ $thumbnail = $this->displayImg->transform( $params );
+ if ( $thumbnail && !$thumbnail->isError() ) {
+ return Html::rawElement( 'a', array(
+ 'href' => $thumbnail->getUrl(),
+ 'class' => 'mw-thumbnail-link'
+ ), wfMessage( 'show-big-image-size' )->numParams(
+ $thumbnail->getWidth(), $thumbnail->getHeight()
+ )->parse() );
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Show a notice that the file is from a shared repository
+ */
+ protected function printSharedImageText() {
+ $out = $this->getContext()->getOutput();
+ $this->loadFile();
+
+ $descUrl = $this->mPage->getFile()->getDescriptionUrl();
+ $descText = $this->mPage->getFile()->getDescriptionText( $this->getContext()->getLanguage() );
+
+ /* Add canonical to head if there is no local page for this shared file */
+ if ( $descUrl && $this->mPage->getID() == 0 ) {
+ $out->setCanonicalUrl( $descUrl );
+ }
+
+ $wrap = "<div class=\"sharedUploadNotice\">\n$1\n</div>\n";
+ $repo = $this->mPage->getFile()->getRepo()->getDisplayName();
+
+ if ( $descUrl && $descText && wfMessage( 'sharedupload-desc-here' )->plain() !== '-' ) {
+ $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
+ } elseif ( $descUrl && wfMessage( 'sharedupload-desc-there' )->plain() !== '-' ) {
+ $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
+ } else {
+ $out->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
+ }
+
+ if ( $descText ) {
+ $this->mExtraDescription = $descText;
+ }
+ }
+
+ public function getUploadUrl() {
+ $this->loadFile();
+ $uploadTitle = SpecialPage::getTitleFor( 'Upload' );
+ return $uploadTitle->getFullURL( array(
+ 'wpDestFile' => $this->mPage->getFile()->getName(),
+ 'wpForReUpload' => 1
+ ) );
+ }
+
+ /**
+ * Print out the various links at the bottom of the image page, e.g. reupload,
+ * external editing (and instructions link) etc.
+ */
+ protected function uploadLinksBox() {
+ global $wgEnableUploads;
+
+ if ( !$wgEnableUploads ) {
+ return;
+ }
+
+ $this->loadFile();
+ if ( !$this->mPage->getFile()->isLocal() ) {
+ return;
+ }
+
+ $out = $this->getContext()->getOutput();
+ $out->addHTML( "<ul>\n" );
+
+ # "Upload a new version of this file" link
+ $canUpload = $this->getTitle()->userCan( 'upload', $this->getContext()->getUser() );
+ if ( $canUpload && UploadBase::userCanReUpload(
+ $this->getContext()->getUser(),
+ $this->mPage->getFile()->name )
+ ) {
+ $ulink = Linker::makeExternalLink(
+ $this->getUploadUrl(),
+ wfMessage( 'uploadnewversion-linktext' )->text()
+ );
+ $out->addHTML( "<li id=\"mw-imagepage-reupload-link\">"
+ . "<div class=\"plainlinks\">{$ulink}</div></li>\n" );
+ } else {
+ $out->addHTML( "<li id=\"mw-imagepage-upload-disallowed\">"
+ . $this->getContext()->msg( 'upload-disallowed-here' )->escaped() . "</li>\n" );
+ }
+
+ $out->addHTML( "</ul>\n" );
+ }
+
+ /**
+ * For overloading
+ */
+ protected function closeShowImage() {
+ }
+
+ /**
+ * If the page we've just displayed is in the "Image" namespace,
+ * we follow it with an upload history of the image and its usage.
+ */
+ protected function imageHistory() {
+ $this->loadFile();
+ $out = $this->getContext()->getOutput();
+ $pager = new ImageHistoryPseudoPager( $this );
+ $out->addHTML( $pager->getBody() );
+ $out->preventClickjacking( $pager->getPreventClickjacking() );
+
+ $this->mPage->getFile()->resetHistory(); // free db resources
+
+ # Exist check because we don't want to show this on pages where an image
+ # doesn't exist along with the noimage message, that would suck. -ævar
+ if ( $this->mPage->getFile()->exists() ) {
+ $this->uploadLinksBox();
+ }
+ }
+
+ /**
+ * @param string $target
+ * @param int $limit
+ * @return ResultWrapper
+ */
+ protected function queryImageLinks( $target, $limit ) {
+ $dbr = wfGetDB( DB_SLAVE );
+
+ return $dbr->select(
+ array( 'imagelinks', 'page' ),
+ array( 'page_namespace', 'page_title', 'il_to' ),
+ array( 'il_to' => $target, 'il_from = page_id' ),
+ __METHOD__,
+ array( 'LIMIT' => $limit + 1, 'ORDER BY' => 'il_from', )
+ );
+ }
+
+ protected function imageLinks() {
+ $limit = 100;
+
+ $out = $this->getContext()->getOutput();
+
+ $rows = array();
+ $redirects = array();
+ foreach ( $this->getTitle()->getRedirectsHere( NS_FILE ) as $redir ) {
+ $redirects[$redir->getDBkey()] = array();
+ $rows[] = (object)array(
+ 'page_namespace' => NS_FILE,
+ 'page_title' => $redir->getDBkey(),
+ );
+ }
+
+ $res = $this->queryImageLinks( $this->getTitle()->getDBkey(), $limit + 1 );
+ foreach ( $res as $row ) {
+ $rows[] = $row;
+ }
+ $count = count( $rows );
+
+ $hasMore = $count > $limit;
+ if ( !$hasMore && count( $redirects ) ) {
+ $res = $this->queryImageLinks( array_keys( $redirects ),
+ $limit - count( $rows ) + 1 );
+ foreach ( $res as $row ) {
+ $redirects[$row->il_to][] = $row;
+ $count++;
+ }
+ $hasMore = ( $res->numRows() + count( $rows ) ) > $limit;
+ }
+
+ if ( $count == 0 ) {
+ $out->wrapWikiMsg(
+ Html::rawElement( 'div',
+ array( 'id' => 'mw-imagepage-nolinkstoimage' ), "\n$1\n" ),
+ 'nolinkstoimage'
+ );
+ return;
+ }
+
+ $out->addHTML( "<div id='mw-imagepage-section-linkstoimage'>\n" );
+ if ( !$hasMore ) {
+ $out->addWikiMsg( 'linkstoimage', $count );
+ } else {
+ // More links than the limit. Add a link to [[Special:Whatlinkshere]]
+ $out->addWikiMsg( 'linkstoimage-more',
+ $this->getContext()->getLanguage()->formatNum( $limit ),
+ $this->getTitle()->getPrefixedDBkey()
+ );
+ }
+
+ $out->addHTML(
+ Html::openElement( 'ul',
+ array( 'class' => 'mw-imagepage-linkstoimage' ) ) . "\n"
+ );
+ $count = 0;
+
+ // Sort the list by namespace:title
+ usort( $rows, array( $this, 'compare' ) );
+
+ // Create links for every element
+ $currentCount = 0;
+ foreach ( $rows as $element ) {
+ $currentCount++;
+ if ( $currentCount > $limit ) {
+ break;
+ }
+
+ $query = array();
+ # Add a redirect=no to make redirect pages reachable
+ if ( isset( $redirects[$element->page_title] ) ) {
+ $query['redirect'] = 'no';
+ }
+ $link = Linker::linkKnown(
+ Title::makeTitle( $element->page_namespace, $element->page_title ),
+ null, array(), $query
+ );
+ if ( !isset( $redirects[$element->page_title] ) ) {
+ # No redirects
+ $liContents = $link;
+ } elseif ( count( $redirects[$element->page_title] ) === 0 ) {
+ # Redirect without usages
+ $liContents = wfMessage( 'linkstoimage-redirect' )->rawParams( $link, '' )->parse();
+ } else {
+ # Redirect with usages
+ $li = '';
+ foreach ( $redirects[$element->page_title] as $row ) {
+ $currentCount++;
+ if ( $currentCount > $limit ) {
+ break;
+ }
+
+ $link2 = Linker::linkKnown( Title::makeTitle( $row->page_namespace, $row->page_title ) );
+ $li .= Html::rawElement(
+ 'li',
+ array( 'class' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
+ $link2
+ ) . "\n";
+ }
+
+ $ul = Html::rawElement(
+ 'ul',
+ array( 'class' => 'mw-imagepage-redirectstofile' ),
+ $li
+ ) . "\n";
+ $liContents = wfMessage( 'linkstoimage-redirect' )->rawParams(
+ $link, $ul )->parse();
+ }
+ $out->addHTML( Html::rawElement(
+ 'li',
+ array( 'class' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
+ $liContents
+ ) . "\n"
+ );
+
+ };
+ $out->addHTML( Html::closeElement( 'ul' ) . "\n" );
+ $res->free();
+
+ // Add a links to [[Special:Whatlinkshere]]
+ if ( $count > $limit ) {
+ $out->addWikiMsg( 'morelinkstoimage', $this->getTitle()->getPrefixedDBkey() );
+ }
+ $out->addHTML( Html::closeElement( 'div' ) . "\n" );
+ }
+
+ protected function imageDupes() {
+ $this->loadFile();
+ $out = $this->getContext()->getOutput();
+
+ $dupes = $this->mPage->getDuplicates();
+ if ( count( $dupes ) == 0 ) {
+ return;
+ }
+
+ $out->addHTML( "<div id='mw-imagepage-section-duplicates'>\n" );
+ $out->addWikiMsg( 'duplicatesoffile',
+ $this->getContext()->getLanguage()->formatNum( count( $dupes ) ), $this->getTitle()->getDBkey()
+ );
+ $out->addHTML( "<ul class='mw-imagepage-duplicates'>\n" );
+
+ /**
+ * @var $file File
+ */
+ foreach ( $dupes as $file ) {
+ $fromSrc = '';
+ if ( $file->isLocal() ) {
+ $link = Linker::linkKnown( $file->getTitle() );
+ } else {
+ $link = Linker::makeExternalLink( $file->getDescriptionUrl(),
+ $file->getTitle()->getPrefixedText() );
+ $fromSrc = wfMessage( 'shared-repo-from', $file->getRepo()->getDisplayName() )->text();
+ }
+ $out->addHTML( "<li>{$link} {$fromSrc}</li>\n" );
+ }
+ $out->addHTML( "</ul></div>\n" );
+ }
+
+ /**
+ * Delete the file, or an earlier version of it
+ */
+ public function delete() {
+ $file = $this->mPage->getFile();
+ if ( !$file->exists() || !$file->isLocal() || $file->getRedirected() ) {
+ // Standard article deletion
+ parent::delete();
+ return;
+ }
+
+ $deleter = new FileDeleteForm( $file );
+ $deleter->execute();
+ }
+
+ /**
+ * Display an error with a wikitext description
+ *
+ * @param string $description
+ */
+ function showError( $description ) {
+ $out = $this->getContext()->getOutput();
+ $out->setPageTitle( wfMessage( 'internalerror' ) );
+ $out->setRobotPolicy( 'noindex,nofollow' );
+ $out->setArticleRelated( false );
+ $out->enableClientCache( false );
+ $out->addWikiText( $description );
+ }
+
+ /**
+ * Callback for usort() to do link sorts by (namespace, title)
+ * Function copied from Title::compare()
+ *
+ * @param object $a Object page to compare with
+ * @param object $b Object page to compare with
+ * @return int Result of string comparison, or namespace comparison
+ */
+ protected function compare( $a, $b ) {
+ if ( $a->page_namespace == $b->page_namespace ) {
+ return strcmp( $a->page_title, $b->page_title );
+ } else {
+ return $a->page_namespace - $b->page_namespace;
+ }
+ }
+
+ /**
+ * Returns the corresponding $wgImageLimits entry for the selected user option
+ *
+ * @param User $user
+ * @param string $optionName Name of a option to check, typically imagesize or thumbsize
+ * @return array
+ * @since 1.21
+ */
+ public function getImageLimitsFromOption( $user, $optionName ) {
+ global $wgImageLimits;
+
+ $option = $user->getIntOption( $optionName );
+ if ( !isset( $wgImageLimits[$option] ) ) {
+ $option = User::getDefaultOption( $optionName );
+ }
+
+ // The user offset might still be incorrect, specially if
+ // $wgImageLimits got changed (see bug #8858).
+ if ( !isset( $wgImageLimits[$option] ) ) {
+ // Default to the first offset in $wgImageLimits
+ $option = 0;
+ }
+
+ return isset( $wgImageLimits[$option] )
+ ? $wgImageLimits[$option]
+ : array( 800, 600 ); // if nothing is set, fallback to a hardcoded default
+ }
+
+ /**
+ * Output a drop-down box for language options for the file
+ *
+ * @param array $langChoices Array of string language codes
+ * @param string $curLang Language code file is being viewed in.
+ * @param string $defaultLang Language code that image is rendered in by default
+ * @return string HTML to insert underneath image.
+ */
+ protected function doRenderLangOpt( array $langChoices, $curLang, $defaultLang ) {
+ global $wgScript;
+ sort( $langChoices );
+ $curLang = wfBCP47( $curLang );
+ $defaultLang = wfBCP47( $defaultLang );
+ $opts = '';
+ $haveCurrentLang = false;
+ $haveDefaultLang = false;
+
+ // We make a list of all the language choices in the file.
+ // Additionally if the default language to render this file
+ // is not included as being in this file (for example, in svgs
+ // usually the fallback content is the english content) also
+ // include a choice for that. Last of all, if we're viewing
+ // the file in a language not on the list, add it as a choice.
+ foreach ( $langChoices as $lang ) {
+ $code = wfBCP47( $lang );
+ $name = Language::fetchLanguageName( $code, $this->getContext()->getLanguage()->getCode() );
+ if ( $name !== '' ) {
+ $display = wfMessage( 'img-lang-opt', $code, $name )->text();
+ } else {
+ $display = $code;
+ }
+ $opts .= "\n" . Xml::option( $display, $code, $curLang === $code );
+ if ( $curLang === $code ) {
+ $haveCurrentLang = true;
+ }
+ if ( $defaultLang === $code ) {
+ $haveDefaultLang = true;
+ }
+ }
+ if ( !$haveDefaultLang ) {
+ // Its hard to know if the content is really in the default language, or
+ // if its just unmarked content that could be in any language.
+ $opts = Xml::option(
+ wfMessage( 'img-lang-default' )->text(),
+ $defaultLang,
+ $defaultLang === $curLang
+ ) . $opts;
+ }
+ if ( !$haveCurrentLang && $defaultLang !== $curLang ) {
+ $name = Language::fetchLanguageName( $curLang, $this->getContext()->getLanguage()->getCode() );
+ if ( $name !== '' ) {
+ $display = wfMessage( 'img-lang-opt', $curLang, $name )->text();
+ } else {
+ $display = $curLang;
+ }
+ $opts = Xml::option( $display, $curLang, true ) . $opts;
+ }
+
+ $select = Html::rawElement(
+ 'select',
+ array( 'id' => 'mw-imglangselector', 'name' => 'lang' ),
+ $opts
+ );
+ $submit = Xml::submitButton( wfMessage( 'img-lang-go' )->text() );
+
+ $formContents = wfMessage( 'img-lang-info' )->rawParams( $select, $submit )->parse()
+ . Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() );
+
+ $langSelectLine = Html::rawElement( 'div', array( 'id' => 'mw-imglangselector-line' ),
+ Html::rawElement( 'form', array( 'action' => $wgScript ), $formContents )
+ );
+ return $langSelectLine;
+ }
+}
+
+/**
+ * Builds the image revision log shown on image pages
+ *
+ * @ingroup Media
+ */
+class ImageHistoryList extends ContextSource {
+
+ /**
+ * @var Title
+ */
+ protected $title;
+
+ /**
+ * @var File
+ */
+ protected $img;
+
+ /**
+ * @var ImagePage
+ */
+ protected $imagePage;
+
+ /**
+ * @var File
+ */
+ protected $current;
+
+ protected $repo, $showThumb;
+ protected $preventClickjacking = false;
+
+ /**
+ * @param ImagePage $imagePage
+ */
+ public function __construct( $imagePage ) {
+ global $wgShowArchiveThumbnails;
+ $this->current = $imagePage->getFile();
+ $this->img = $imagePage->getDisplayedFile();
+ $this->title = $imagePage->getTitle();
+ $this->imagePage = $imagePage;
+ $this->showThumb = $wgShowArchiveThumbnails && $this->img->canRender();
+ $this->setContext( $imagePage->getContext() );
+ }
+
+ /**
+ * @return ImagePage
+ */
+ public function getImagePage() {
+ return $this->imagePage;
+ }
+
+ /**
+ * @return File
+ */
+ public function getFile() {
+ return $this->img;
+ }
+
+ /**
+ * @param string $navLinks
+ * @return string
+ */
+ public function beginImageHistoryList( $navLinks = '' ) {
+ return Xml::element( 'h2', array( 'id' => 'filehistory' ), $this->msg( 'filehist' )->text() )
+ . "\n"
+ . "<div id=\"mw-imagepage-section-filehistory\">\n"
+ . $this->msg( 'filehist-help' )->parseAsBlock()
+ . $navLinks . "\n"
+ . Xml::openElement( 'table', array( 'class' => 'wikitable filehistory' ) ) . "\n"
+ . '<tr><td></td>'
+ . ( $this->current->isLocal()
+ && ( $this->getUser()->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '<td></td>' : '' )
+ . '<th>' . $this->msg( 'filehist-datetime' )->escaped() . '</th>'
+ . ( $this->showThumb ? '<th>' . $this->msg( 'filehist-thumb' )->escaped() . '</th>' : '' )
+ . '<th>' . $this->msg( 'filehist-dimensions' )->escaped() . '</th>'
+ . '<th>' . $this->msg( 'filehist-user' )->escaped() . '</th>'
+ . '<th>' . $this->msg( 'filehist-comment' )->escaped() . '</th>'
+ . "</tr>\n";
+ }
+
+ /**
+ * @param string $navLinks
+ * @return string
+ */
+ public function endImageHistoryList( $navLinks = '' ) {
+ return "</table>\n$navLinks\n</div>\n";
+ }
+
+ /**
+ * @param bool $iscur
+ * @param File $file
+ * @return string
+ */
+ public function imageHistoryLine( $iscur, $file ) {
+ global $wgContLang;
+
+ $user = $this->getUser();
+ $lang = $this->getLanguage();
+ $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() );
+ $img = $iscur ? $file->getName() : $file->getArchiveName();
+ $userId = $file->getUser( 'id' );
+ $userText = $file->getUser( 'text' );
+ $description = $file->getDescription( File::FOR_THIS_USER, $user );
+
+ $local = $this->current->isLocal();
+ $row = $selected = '';
+
+ // Deletion link
+ if ( $local && ( $user->isAllowedAny( 'delete', 'deletedhistory' ) ) ) {
+ $row .= '<td>';
+ # Link to remove from history
+ if ( $user->isAllowed( 'delete' ) ) {
+ $q = array( 'action' => 'delete' );
+ if ( !$iscur ) {
+ $q['oldimage'] = $img;
+ }
+ $row .= Linker::linkKnown(
+ $this->title,
+ $this->msg( $iscur ? 'filehist-deleteall' : 'filehist-deleteone' )->escaped(),
+ array(), $q
+ );
+ }
+ # Link to hide content. Don't show useless link to people who cannot hide revisions.
+ $canHide = $user->isAllowed( 'deleterevision' );
+ if ( $canHide || ( $user->isAllowed( 'deletedhistory' ) && $file->getVisibility() ) ) {
+ if ( $user->isAllowed( 'delete' ) ) {
+ $row .= '<br />';
+ }
+ // If file is top revision or locked from this user, don't link
+ if ( $iscur || !$file->userCan( File::DELETED_RESTRICTED, $user ) ) {
+ $del = Linker::revDeleteLinkDisabled( $canHide );
+ } else {
+ list( $ts, ) = explode( '!', $img, 2 );
+ $query = array(
+ 'type' => 'oldimage',
+ 'target' => $this->title->getPrefixedText(),
+ 'ids' => $ts,
+ );
+ $del = Linker::revDeleteLink( $query,
+ $file->isDeleted( File::DELETED_RESTRICTED ), $canHide );
+ }
+ $row .= $del;
+ }
+ $row .= '</td>';
+ }
+
+ // Reversion link/current indicator
+ $row .= '<td>';
+ if ( $iscur ) {
+ $row .= $this->msg( 'filehist-current' )->escaped();
+ } elseif ( $local && $this->title->quickUserCan( 'edit', $user )
+ && $this->title->quickUserCan( 'upload', $user )
+ ) {
+ if ( $file->isDeleted( File::DELETED_FILE ) ) {
+ $row .= $this->msg( 'filehist-revert' )->escaped();
+ } else {
+ $row .= Linker::linkKnown(
+ $this->title,
+ $this->msg( 'filehist-revert' )->escaped(),
+ array(),
+ array(
+ 'action' => 'revert',
+ 'oldimage' => $img,
+ 'wpEditToken' => $user->getEditToken( $img )
+ )
+ );
+ }
+ }
+ $row .= '</td>';
+
+ // Date/time and image link
+ if ( $file->getTimestamp() === $this->img->getTimestamp() ) {
+ $selected = "class='filehistory-selected'";
+ }
+ $row .= "<td $selected style='white-space: nowrap;'>";
+ if ( !$file->userCan( File::DELETED_FILE, $user ) ) {
+ # Don't link to unviewable files
+ $row .= '<span class="history-deleted">'
+ . $lang->userTimeAndDate( $timestamp, $user ) . '</span>';
+ } elseif ( $file->isDeleted( File::DELETED_FILE ) ) {
+ if ( $local ) {
+ $this->preventClickjacking();
+ $revdel = SpecialPage::getTitleFor( 'Revisiondelete' );
+ # Make a link to review the image
+ $url = Linker::linkKnown(
+ $revdel,
+ $lang->userTimeAndDate( $timestamp, $user ),
+ array(),
+ array(
+ 'target' => $this->title->getPrefixedText(),
+ 'file' => $img,
+ 'token' => $user->getEditToken( $img )
+ )
+ );
+ } else {
+ $url = $lang->userTimeAndDate( $timestamp, $user );
+ }
+ $row .= '<span class="history-deleted">' . $url . '</span>';
+ } else {
+ $url = $iscur ? $this->current->getUrl() : $this->current->getArchiveUrl( $img );
+ $row .= Xml::element(
+ 'a',
+ array( 'href' => $url ),
+ $lang->userTimeAndDate( $timestamp, $user )
+ );
+ }
+ $row .= "</td>";
+
+ // Thumbnail
+ if ( $this->showThumb ) {
+ $row .= '<td>' . $this->getThumbForLine( $file ) . '</td>';
+ }
+
+ // Image dimensions + size
+ $row .= '<td>';
+ $row .= htmlspecialchars( $file->getDimensionsString() );
+ $row .= $this->msg( 'word-separator' )->escaped();
+ $row .= '<span style="white-space: nowrap;">';
+ $row .= $this->msg( 'parentheses' )->sizeParams( $file->getSize() )->escaped();
+ $row .= '</span>';
+ $row .= '</td>';
+
+ // Uploading user
+ $row .= '<td>';
+ // Hide deleted usernames
+ if ( $file->isDeleted( File::DELETED_USER ) ) {
+ $row .= '<span class="history-deleted">'
+ . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
+ } else {
+ if ( $local ) {
+ $row .= Linker::userLink( $userId, $userText );
+ $row .= $this->msg( 'word-separator' )->escaped();
+ $row .= '<span style="white-space: nowrap;">';
+ $row .= Linker::userToolLinks( $userId, $userText );
+ $row .= '</span>';
+ } else {
+ $row .= htmlspecialchars( $userText );
+ }
+ }
+ $row .= '</td>';
+
+ // Don't show deleted descriptions
+ if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
+ $row .= '<td><span class="history-deleted">' .
+ $this->msg( 'rev-deleted-comment' )->escaped() . '</span></td>';
+ } else {
+ $row .= '<td dir="' . $wgContLang->getDir() . '">' .
+ Linker::formatComment( $description, $this->title ) . '</td>';
+ }
+
+ $rowClass = null;
+ wfRunHooks( 'ImagePageFileHistoryLine', array( $this, $file, &$row, &$rowClass ) );
+ $classAttr = $rowClass ? " class='$rowClass'" : '';
+
+ return "<tr{$classAttr}>{$row}</tr>\n";
+ }
+
+ /**
+ * @param File $file
+ * @return string
+ */
+ protected function getThumbForLine( $file ) {
+ $lang = $this->getLanguage();
+ $user = $this->getUser();
+ if ( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE, $user )
+ && !$file->isDeleted( File::DELETED_FILE )
+ ) {
+ $params = array(
+ 'width' => '120',
+ 'height' => '120',
+ );
+ $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() );
+
+ $thumbnail = $file->transform( $params );
+ $options = array(
+ 'alt' => $this->msg( 'filehist-thumbtext',
+ $lang->userTimeAndDate( $timestamp, $user ),
+ $lang->userDate( $timestamp, $user ),
+ $lang->userTime( $timestamp, $user ) )->text(),
+ 'file-link' => true,
+ );
+
+ if ( !$thumbnail ) {
+ return $this->msg( 'filehist-nothumb' )->escaped();
+ }
+
+ return $thumbnail->toHtml( $options );
+ } else {
+ return $this->msg( 'filehist-nothumb' )->escaped();
+ }
+ }
+
+ /**
+ * @param bool $enable
+ */
+ protected function preventClickjacking( $enable = true ) {
+ $this->preventClickjacking = $enable;
+ }
+
+ /**
+ * @return bool
+ */
+ public function getPreventClickjacking() {
+ return $this->preventClickjacking;
+ }
+}
+
+class ImageHistoryPseudoPager extends ReverseChronologicalPager {
+ protected $preventClickjacking = false;
+
+ /**
+ * @var File
+ */
+ protected $mImg;
+
+ /**
+ * @var Title
+ */
+ protected $mTitle;
+
+ /**
+ * @param ImagePage $imagePage
+ */
+ function __construct( $imagePage ) {
+ parent::__construct( $imagePage->getContext() );
+ $this->mImagePage = $imagePage;
+ $this->mTitle = clone ( $imagePage->getTitle() );
+ $this->mTitle->setFragment( '#filehistory' );
+ $this->mImg = null;
+ $this->mHist = array();
+ $this->mRange = array( 0, 0 ); // display range
+ }
+
+ /**
+ * @return Title
+ */
+ function getTitle() {
+ return $this->mTitle;
+ }
+
+ function getQueryInfo() {
+ return false;
+ }
+
+ /**
+ * @return string
+ */
+ function getIndexField() {
+ return '';
+ }
+
+ /**
+ * @param object $row
+ * @return string
+ */
+ function formatRow( $row ) {
+ return '';
+ }
+
+ /**
+ * @return string
+ */
+ function getBody() {
+ $s = '';
+ $this->doQuery();
+ if ( count( $this->mHist ) ) {
+ $list = new ImageHistoryList( $this->mImagePage );
+ # Generate prev/next links
+ $navLink = $this->getNavigationBar();
+ $s = $list->beginImageHistoryList( $navLink );
+ // Skip rows there just for paging links
+ for ( $i = $this->mRange[0]; $i <= $this->mRange[1]; $i++ ) {
+ $file = $this->mHist[$i];
+ $s .= $list->imageHistoryLine( !$file->isOld(), $file );
+ }
+ $s .= $list->endImageHistoryList( $navLink );
+
+ if ( $list->getPreventClickjacking() ) {
+ $this->preventClickjacking();
+ }
+ }
+ return $s;
+ }
+
+ function doQuery() {
+ if ( $this->mQueryDone ) {
+ return;
+ }
+ $this->mImg = $this->mImagePage->getFile(); // ensure loading
+ if ( !$this->mImg->exists() ) {
+ return;
+ }
+ $queryLimit = $this->mLimit + 1; // limit plus extra row
+ if ( $this->mIsBackwards ) {
+ // Fetch the file history
+ $this->mHist = $this->mImg->getHistory( $queryLimit, null, $this->mOffset, false );
+ // The current rev may not meet the offset/limit
+ $numRows = count( $this->mHist );
+ if ( $numRows <= $this->mLimit && $this->mImg->getTimestamp() > $this->mOffset ) {
+ $this->mHist = array_merge( array( $this->mImg ), $this->mHist );
+ }
+ } else {
+ // The current rev may not meet the offset
+ if ( !$this->mOffset || $this->mImg->getTimestamp() < $this->mOffset ) {
+ $this->mHist[] = $this->mImg;
+ }
+ // Old image versions (fetch extra row for nav links)
+ $oiLimit = count( $this->mHist ) ? $this->mLimit : $this->mLimit + 1;
+ // Fetch the file history
+ $this->mHist = array_merge( $this->mHist,
+ $this->mImg->getHistory( $oiLimit, $this->mOffset, null, false ) );
+ }
+ $numRows = count( $this->mHist ); // Total number of query results
+ if ( $numRows ) {
+ # Index value of top item in the list
+ $firstIndex = $this->mIsBackwards ?
+ $this->mHist[$numRows - 1]->getTimestamp() : $this->mHist[0]->getTimestamp();
+ # Discard the extra result row if there is one
+ if ( $numRows > $this->mLimit && $numRows > 1 ) {
+ if ( $this->mIsBackwards ) {
+ # Index value of item past the index
+ $this->mPastTheEndIndex = $this->mHist[0]->getTimestamp();
+ # Index value of bottom item in the list
+ $lastIndex = $this->mHist[1]->getTimestamp();
+ # Display range
+ $this->mRange = array( 1, $numRows - 1 );
+ } else {
+ # Index value of item past the index
+ $this->mPastTheEndIndex = $this->mHist[$numRows - 1]->getTimestamp();
+ # Index value of bottom item in the list
+ $lastIndex = $this->mHist[$numRows - 2]->getTimestamp();
+ # Display range
+ $this->mRange = array( 0, $numRows - 2 );
+ }
+ } else {
+ # Setting indexes to an empty string means that they will be
+ # omitted if they would otherwise appear in URLs. It just so
+ # happens that this is the right thing to do in the standard
+ # UI, in all the relevant cases.
+ $this->mPastTheEndIndex = '';
+ # Index value of bottom item in the list
+ $lastIndex = $this->mIsBackwards ?
+ $this->mHist[0]->getTimestamp() : $this->mHist[$numRows - 1]->getTimestamp();
+ # Display range
+ $this->mRange = array( 0, $numRows - 1 );
+ }
+ } else {
+ $firstIndex = '';
+ $lastIndex = '';
+ $this->mPastTheEndIndex = '';
+ }
+ if ( $this->mIsBackwards ) {
+ $this->mIsFirst = ( $numRows < $queryLimit );
+ $this->mIsLast = ( $this->mOffset == '' );
+ $this->mLastShown = $firstIndex;
+ $this->mFirstShown = $lastIndex;
+ } else {
+ $this->mIsFirst = ( $this->mOffset == '' );
+ $this->mIsLast = ( $numRows < $queryLimit );
+ $this->mLastShown = $lastIndex;
+ $this->mFirstShown = $firstIndex;
+ }
+ $this->mQueryDone = true;
+ }
+
+ /**
+ * @param bool $enable
+ */
+ protected function preventClickjacking( $enable = true ) {
+ $this->preventClickjacking = $enable;
+ }
+
+ /**
+ * @return bool
+ */
+ public function getPreventClickjacking() {
+ return $this->preventClickjacking;
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * Special handling for category pages.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Special handling for category pages
+ */
+class WikiCategoryPage extends WikiPage {
+
+ /**
+ * Don't return a 404 for categories in use.
+ * In use defined as: either the actual page exists
+ * or the category currently has members.
+ *
+ * @return bool
+ */
+ public function hasViewableContent() {
+ if ( parent::hasViewableContent() ) {
+ return true;
+ } else {
+ $cat = Category::newFromTitle( $this->mTitle );
+ // If any of these are not 0, then has members
+ if ( $cat->getPageCount()
+ || $cat->getSubcatCount()
+ || $cat->getFileCount()
+ ) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Special handling for file pages.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Special handling for file pages
+ *
+ * @ingroup Media
+ */
+class WikiFilePage extends WikiPage {
+ /**
+ * @var File
+ */
+ protected $mFile = false; // !< File object
+ protected $mRepo = null; // !<
+ protected $mFileLoaded = false; // !<
+ protected $mDupes = null; // !<
+
+ public function __construct( $title ) {
+ parent::__construct( $title );
+ $this->mDupes = null;
+ $this->mRepo = null;
+ }
+
+ public function getActionOverrides() {
+ $overrides = parent::getActionOverrides();
+ $overrides['revert'] = 'RevertFileAction';
+ return $overrides;
+ }
+
+ /**
+ * @param File $file
+ */
+ public function setFile( $file ) {
+ $this->mFile = $file;
+ $this->mFileLoaded = true;
+ }
+
+ /**
+ * @return bool
+ */
+ protected function loadFile() {
+ if ( $this->mFileLoaded ) {
+ return true;
+ }
+ $this->mFileLoaded = true;
+
+ $this->mFile = wfFindFile( $this->mTitle );
+ if ( !$this->mFile ) {
+ $this->mFile = wfLocalFile( $this->mTitle ); // always a File
+ }
+ $this->mRepo = $this->mFile->getRepo();
+ return true;
+ }
+
+ /**
+ * @return mixed|null|Title
+ */
+ public function getRedirectTarget() {
+ $this->loadFile();
+ if ( $this->mFile->isLocal() ) {
+ return parent::getRedirectTarget();
+ }
+ // Foreign image page
+ $from = $this->mFile->getRedirected();
+ $to = $this->mFile->getName();
+ if ( $from == $to ) {
+ return null;
+ }
+ $this->mRedirectTarget = Title::makeTitle( NS_FILE, $to );
+ return $this->mRedirectTarget;
+ }
+
+ /**
+ * @return bool|mixed|Title
+ */
+ public function followRedirect() {
+ $this->loadFile();
+ if ( $this->mFile->isLocal() ) {
+ return parent::followRedirect();
+ }
+ $from = $this->mFile->getRedirected();
+ $to = $this->mFile->getName();
+ if ( $from == $to ) {
+ return false;
+ }
+ return Title::makeTitle( NS_FILE, $to );
+ }
+
+ /**
+ * @return bool
+ */
+ public function isRedirect() {
+ $this->loadFile();
+ if ( $this->mFile->isLocal() ) {
+ return parent::isRedirect();
+ }
+
+ return (bool)$this->mFile->getRedirected();
+ }
+
+ /**
+ * @return bool
+ */
+ public function isLocal() {
+ $this->loadFile();
+ return $this->mFile->isLocal();
+ }
+
+ /**
+ * @return bool|File
+ */
+ public function getFile() {
+ $this->loadFile();
+ return $this->mFile;
+ }
+
+ /**
+ * @return array|null
+ */
+ public function getDuplicates() {
+ $this->loadFile();
+ if ( !is_null( $this->mDupes ) ) {
+ return $this->mDupes;
+ }
+ $hash = $this->mFile->getSha1();
+ if ( !( $hash ) ) {
+ $this->mDupes = array();
+ return $this->mDupes;
+ }
+ $dupes = RepoGroup::singleton()->findBySha1( $hash );
+ // Remove duplicates with self and non matching file sizes
+ $self = $this->mFile->getRepoName() . ':' . $this->mFile->getName();
+ $size = $this->mFile->getSize();
+
+ /**
+ * @var $file File
+ */
+ foreach ( $dupes as $index => $file ) {
+ $key = $file->getRepoName() . ':' . $file->getName();
+ if ( $key == $self ) {
+ unset( $dupes[$index] );
+ }
+ if ( $file->getSize() != $size ) {
+ unset( $dupes[$index] );
+ }
+ }
+ $this->mDupes = $dupes;
+ return $this->mDupes;
+ }
+
+ /**
+ * Override handling of action=purge
+ * @return bool
+ */
+ public function doPurge() {
+ $this->loadFile();
+ if ( $this->mFile->exists() ) {
+ wfDebug( 'ImagePage::doPurge purging ' . $this->mFile->getName() . "\n" );
+ $update = new HTMLCacheUpdate( $this->mTitle, 'imagelinks' );
+ $update->doUpdate();
+ $this->mFile->upgradeRow();
+ $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
+ } else {
+ wfDebug( 'ImagePage::doPurge no image for '
+ . $this->mFile->getName() . "; limiting purge to cache only\n" );
+ // even if the file supposedly doesn't exist, force any cached information
+ // to be updated (in case the cached information is wrong)
+ $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
+ }
+ if ( $this->mRepo ) {
+ // Purge redirect cache
+ $this->mRepo->invalidateImageRedirect( $this->mTitle );
+ }
+ return parent::doPurge();
+ }
+
+ /**
+ * Get the categories this file is a member of on the wiki where it was uploaded.
+ * For local files, this is the same as getCategories().
+ * For foreign API files (InstantCommons), this is not supported currently.
+ * Results will include hidden categories.
+ *
+ * @return TitleArray|Title[]
+ * @since 1.23
+ */
+ public function getForeignCategories() {
+ $this->loadFile();
+ $title = $this->mTitle;
+ $file = $this->mFile;
+
+ if ( ! $file instanceof LocalFile ) {
+ wfDebug( __CLASS__ . '::' . __METHOD__ . " is not supported for this file\n" );
+ return TitleArray::newFromResult( new FakeResultWrapper( array() ) );
+ }
+
+ /** @var LocalRepo $repo */
+ $repo = $file->getRepo();
+ $dbr = $repo->getSlaveDB();
+
+ $res = $dbr->select(
+ array( 'page', 'categorylinks' ),
+ array(
+ 'page_title' => 'cl_to',
+ 'page_namespace' => NS_CATEGORY,
+ ),
+ array(
+ 'page_namespace' => $title->getNamespace(),
+ 'page_title' => $title->getDBkey(),
+ ),
+ __METHOD__,
+ array(),
+ array( 'categorylinks' => array( 'INNER JOIN', 'page_id = cl_from' ) )
+ );
+
+ return TitleArray::newFromResult( $res );
+ }
+}
--- /dev/null
+<?php
+/**
+ * Base representation for a MediaWiki page.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Abstract class for type hinting (accepts WikiPage, Article, ImagePage, CategoryPage)
+ */
+interface Page {
+}
+
+/**
+ * Class representing a MediaWiki article and history.
+ *
+ * Some fields are public only for backwards-compatibility. Use accessors.
+ * In the past, this class was part of Article.php and everything was public.
+ *
+ * @internal documentation reviewed 15 Mar 2010
+ */
+class WikiPage implements Page, IDBAccessObject {
+ // Constants for $mDataLoadedFrom and related
+
+ /**
+ * @var Title
+ */
+ public $mTitle = null;
+
+ /**@{{
+ * @protected
+ */
+ public $mDataLoaded = false; // !< Boolean
+ public $mIsRedirect = false; // !< Boolean
+ public $mLatest = false; // !< Integer (false means "not loaded")
+ /**@}}*/
+
+ /** @var stdclass Map of cache fields (text, parser output, ect) for a proposed/new edit */
+ public $mPreparedEdit = false;
+
+ /**
+ * @var int
+ */
+ protected $mId = null;
+
+ /**
+ * @var int One of the READ_* constants
+ */
+ protected $mDataLoadedFrom = self::READ_NONE;
+
+ /**
+ * @var Title
+ */
+ protected $mRedirectTarget = null;
+
+ /**
+ * @var Revision
+ */
+ protected $mLastRevision = null;
+
+ /**
+ * @var string Timestamp of the current revision or empty string if not loaded
+ */
+ protected $mTimestamp = '';
+
+ /**
+ * @var string
+ */
+ protected $mTouched = '19700101000000';
+
+ /**
+ * @var string
+ */
+ protected $mLinksUpdated = '19700101000000';
+
+ /**
+ * @var int|null
+ */
+ protected $mCounter = null;
+
+ /**
+ * Constructor and clear the article
+ * @param Title $title Reference to a Title object.
+ */
+ public function __construct( Title $title ) {
+ $this->mTitle = $title;
+ }
+
+ /**
+ * Create a WikiPage object of the appropriate class for the given title.
+ *
+ * @param Title $title
+ *
+ * @throws MWException
+ * @return WikiPage Object of the appropriate type
+ */
+ public static function factory( Title $title ) {
+ $ns = $title->getNamespace();
+
+ if ( $ns == NS_MEDIA ) {
+ throw new MWException( "NS_MEDIA is a virtual namespace; use NS_FILE." );
+ } elseif ( $ns < 0 ) {
+ throw new MWException( "Invalid or virtual namespace $ns given." );
+ }
+
+ switch ( $ns ) {
+ case NS_FILE:
+ $page = new WikiFilePage( $title );
+ break;
+ case NS_CATEGORY:
+ $page = new WikiCategoryPage( $title );
+ break;
+ default:
+ $page = new WikiPage( $title );
+ }
+
+ return $page;
+ }
+
+ /**
+ * Constructor from a page id
+ *
+ * @param int $id Article ID to load
+ * @param string|int $from One of the following values:
+ * - "fromdb" or WikiPage::READ_NORMAL to select from a slave database
+ * - "fromdbmaster" or WikiPage::READ_LATEST to select from the master database
+ *
+ * @return WikiPage|null
+ */
+ public static function newFromID( $id, $from = 'fromdb' ) {
+ // page id's are never 0 or negative, see bug 61166
+ if ( $id < 1 ) {
+ return null;
+ }
+
+ $from = self::convertSelectType( $from );
+ $db = wfGetDB( $from === self::READ_LATEST ? DB_MASTER : DB_SLAVE );
+ $row = $db->selectRow( 'page', self::selectFields(), array( 'page_id' => $id ), __METHOD__ );
+ if ( !$row ) {
+ return null;
+ }
+ return self::newFromRow( $row, $from );
+ }
+
+ /**
+ * Constructor from a database row
+ *
+ * @since 1.20
+ * @param object $row Database row containing at least fields returned by selectFields().
+ * @param string|int $from Source of $data:
+ * - "fromdb" or WikiPage::READ_NORMAL: from a slave DB
+ * - "fromdbmaster" or WikiPage::READ_LATEST: from the master DB
+ * - "forupdate" or WikiPage::READ_LOCKING: from the master DB using SELECT FOR UPDATE
+ * @return WikiPage
+ */
+ public static function newFromRow( $row, $from = 'fromdb' ) {
+ $page = self::factory( Title::newFromRow( $row ) );
+ $page->loadFromRow( $row, $from );
+ return $page;
+ }
+
+ /**
+ * Convert 'fromdb', 'fromdbmaster' and 'forupdate' to READ_* constants.
+ *
+ * @param object|string|int $type
+ * @return mixed
+ */
+ private static function convertSelectType( $type ) {
+ switch ( $type ) {
+ case 'fromdb':
+ return self::READ_NORMAL;
+ case 'fromdbmaster':
+ return self::READ_LATEST;
+ case 'forupdate':
+ return self::READ_LOCKING;
+ default:
+ // It may already be an integer or whatever else
+ return $type;
+ }
+ }
+
+ /**
+ * Returns overrides for action handlers.
+ * Classes listed here will be used instead of the default one when
+ * (and only when) $wgActions[$action] === true. This allows subclasses
+ * to override the default behavior.
+ *
+ * @todo Move this UI stuff somewhere else
+ *
+ * @return array
+ */
+ public function getActionOverrides() {
+ $content_handler = $this->getContentHandler();
+ return $content_handler->getActionOverrides();
+ }
+
+ /**
+ * Returns the ContentHandler instance to be used to deal with the content of this WikiPage.
+ *
+ * Shorthand for ContentHandler::getForModelID( $this->getContentModel() );
+ *
+ * @return ContentHandler
+ *
+ * @since 1.21
+ */
+ public function getContentHandler() {
+ return ContentHandler::getForModelID( $this->getContentModel() );
+ }
+
+ /**
+ * Get the title object of the article
+ * @return Title Title object of this page
+ */
+ public function getTitle() {
+ return $this->mTitle;
+ }
+
+ /**
+ * Clear the object
+ * @return void
+ */
+ public function clear() {
+ $this->mDataLoaded = false;
+ $this->mDataLoadedFrom = self::READ_NONE;
+
+ $this->clearCacheFields();
+ }
+
+ /**
+ * Clear the object cache fields
+ * @return void
+ */
+ protected function clearCacheFields() {
+ $this->mId = null;
+ $this->mCounter = null;
+ $this->mRedirectTarget = null; // Title object if set
+ $this->mLastRevision = null; // Latest revision
+ $this->mTouched = '19700101000000';
+ $this->mLinksUpdated = '19700101000000';
+ $this->mTimestamp = '';
+ $this->mIsRedirect = false;
+ $this->mLatest = false;
+ // Bug 57026: do not clear mPreparedEdit since prepareTextForEdit() already checks
+ // the requested rev ID and content against the cached one for equality. For most
+ // content types, the output should not change during the lifetime of this cache.
+ // Clearing it can cause extra parses on edit for no reason.
+ }
+
+ /**
+ * Clear the mPreparedEdit cache field, as may be needed by mutable content types
+ * @return void
+ * @since 1.23
+ */
+ public function clearPreparedEdit() {
+ $this->mPreparedEdit = false;
+ }
+
+ /**
+ * Return the list of revision fields that should be selected to create
+ * a new page.
+ *
+ * @return array
+ */
+ public static function selectFields() {
+ global $wgContentHandlerUseDB;
+
+ $fields = array(
+ 'page_id',
+ 'page_namespace',
+ 'page_title',
+ 'page_restrictions',
+ 'page_counter',
+ 'page_is_redirect',
+ 'page_is_new',
+ 'page_random',
+ 'page_touched',
+ 'page_links_updated',
+ 'page_latest',
+ 'page_len',
+ );
+
+ if ( $wgContentHandlerUseDB ) {
+ $fields[] = 'page_content_model';
+ }
+
+ return $fields;
+ }
+
+ /**
+ * Fetch a page record with the given conditions
+ * @param DatabaseBase $dbr
+ * @param array $conditions
+ * @param array $options
+ * @return object|bool Database result resource, or false on failure
+ */
+ protected function pageData( $dbr, $conditions, $options = array() ) {
+ $fields = self::selectFields();
+
+ wfRunHooks( 'ArticlePageDataBefore', array( &$this, &$fields ) );
+
+ $row = $dbr->selectRow( 'page', $fields, $conditions, __METHOD__, $options );
+
+ wfRunHooks( 'ArticlePageDataAfter', array( &$this, &$row ) );
+
+ return $row;
+ }
+
+ /**
+ * Fetch a page record matching the Title object's namespace and title
+ * using a sanitized title string
+ *
+ * @param DatabaseBase $dbr
+ * @param Title $title
+ * @param array $options
+ * @return object|bool Database result resource, or false on failure
+ */
+ public function pageDataFromTitle( $dbr, $title, $options = array() ) {
+ return $this->pageData( $dbr, array(
+ 'page_namespace' => $title->getNamespace(),
+ 'page_title' => $title->getDBkey() ), $options );
+ }
+
+ /**
+ * Fetch a page record matching the requested ID
+ *
+ * @param DatabaseBase $dbr
+ * @param int $id
+ * @param array $options
+ * @return object|bool Database result resource, or false on failure
+ */
+ public function pageDataFromId( $dbr, $id, $options = array() ) {
+ return $this->pageData( $dbr, array( 'page_id' => $id ), $options );
+ }
+
+ /**
+ * Set the general counter, title etc data loaded from
+ * some source.
+ *
+ * @param object|string|int $from One of the following:
+ * - A DB query result object.
+ * - "fromdb" or WikiPage::READ_NORMAL to get from a slave DB.
+ * - "fromdbmaster" or WikiPage::READ_LATEST to get from the master DB.
+ * - "forupdate" or WikiPage::READ_LOCKING to get from the master DB
+ * using SELECT FOR UPDATE.
+ *
+ * @return void
+ */
+ public function loadPageData( $from = 'fromdb' ) {
+ $from = self::convertSelectType( $from );
+ if ( is_int( $from ) && $from <= $this->mDataLoadedFrom ) {
+ // We already have the data from the correct location, no need to load it twice.
+ return;
+ }
+
+ if ( $from === self::READ_LOCKING ) {
+ $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle, array( 'FOR UPDATE' ) );
+ } elseif ( $from === self::READ_LATEST ) {
+ $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
+ } elseif ( $from === self::READ_NORMAL ) {
+ $data = $this->pageDataFromTitle( wfGetDB( DB_SLAVE ), $this->mTitle );
+ // Use a "last rev inserted" timestamp key to diminish the issue of slave lag.
+ // Note that DB also stores the master position in the session and checks it.
+ $touched = $this->getCachedLastEditTime();
+ if ( $touched ) { // key set
+ if ( !$data || $touched > wfTimestamp( TS_MW, $data->page_touched ) ) {
+ $from = self::READ_LATEST;
+ $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
+ }
+ }
+ } else {
+ // No idea from where the caller got this data, assume slave database.
+ $data = $from;
+ $from = self::READ_NORMAL;
+ }
+
+ $this->loadFromRow( $data, $from );
+ }
+
+ /**
+ * Load the object from a database row
+ *
+ * @since 1.20
+ * @param object $data Database row containing at least fields returned by selectFields()
+ * @param string|int $from One of the following:
+ * - "fromdb" or WikiPage::READ_NORMAL if the data comes from a slave DB
+ * - "fromdbmaster" or WikiPage::READ_LATEST if the data comes from the master DB
+ * - "forupdate" or WikiPage::READ_LOCKING if the data comes from from
+ * the master DB using SELECT FOR UPDATE
+ */
+ public function loadFromRow( $data, $from ) {
+ $lc = LinkCache::singleton();
+ $lc->clearLink( $this->mTitle );
+
+ if ( $data ) {
+ $lc->addGoodLinkObjFromRow( $this->mTitle, $data );
+
+ $this->mTitle->loadFromRow( $data );
+
+ // Old-fashioned restrictions
+ $this->mTitle->loadRestrictions( $data->page_restrictions );
+
+ $this->mId = intval( $data->page_id );
+ $this->mCounter = intval( $data->page_counter );
+ $this->mTouched = wfTimestamp( TS_MW, $data->page_touched );
+ $this->mLinksUpdated = wfTimestampOrNull( TS_MW, $data->page_links_updated );
+ $this->mIsRedirect = intval( $data->page_is_redirect );
+ $this->mLatest = intval( $data->page_latest );
+ // Bug 37225: $latest may no longer match the cached latest Revision object.
+ // Double-check the ID of any cached latest Revision object for consistency.
+ if ( $this->mLastRevision && $this->mLastRevision->getId() != $this->mLatest ) {
+ $this->mLastRevision = null;
+ $this->mTimestamp = '';
+ }
+ } else {
+ $lc->addBadLinkObj( $this->mTitle );
+
+ $this->mTitle->loadFromRow( false );
+
+ $this->clearCacheFields();
+
+ $this->mId = 0;
+ }
+
+ $this->mDataLoaded = true;
+ $this->mDataLoadedFrom = self::convertSelectType( $from );
+ }
+
+ /**
+ * @return int Page ID
+ */
+ public function getId() {
+ if ( !$this->mDataLoaded ) {
+ $this->loadPageData();
+ }
+ return $this->mId;
+ }
+
+ /**
+ * @return bool Whether or not the page exists in the database
+ */
+ public function exists() {
+ if ( !$this->mDataLoaded ) {
+ $this->loadPageData();
+ }
+ return $this->mId > 0;
+ }
+
+ /**
+ * Check if this page is something we're going to be showing
+ * some sort of sensible content for. If we return false, page
+ * views (plain action=view) will return an HTTP 404 response,
+ * so spiders and robots can know they're following a bad link.
+ *
+ * @return bool
+ */
+ public function hasViewableContent() {
+ return $this->exists() || $this->mTitle->isAlwaysKnown();
+ }
+
+ /**
+ * @return int The view count for the page
+ */
+ public function getCount() {
+ if ( !$this->mDataLoaded ) {
+ $this->loadPageData();
+ }
+
+ return $this->mCounter;
+ }
+
+ /**
+ * Tests if the article content represents a redirect
+ *
+ * @return bool
+ */
+ public function isRedirect() {
+ $content = $this->getContent();
+ if ( !$content ) {
+ return false;
+ }
+
+ return $content->isRedirect();
+ }
+
+ /**
+ * Returns the page's content model id (see the CONTENT_MODEL_XXX constants).
+ *
+ * Will use the revisions actual content model if the page exists,
+ * and the page's default if the page doesn't exist yet.
+ *
+ * @return string
+ *
+ * @since 1.21
+ */
+ public function getContentModel() {
+ if ( $this->exists() ) {
+ // look at the revision's actual content model
+ $rev = $this->getRevision();
+
+ if ( $rev !== null ) {
+ return $rev->getContentModel();
+ } else {
+ $title = $this->mTitle->getPrefixedDBkey();
+ wfWarn( "Page $title exists but has no (visible) revisions!" );
+ }
+ }
+
+ // use the default model for this page
+ return $this->mTitle->getContentModel();
+ }
+
+ /**
+ * Loads page_touched and returns a value indicating if it should be used
+ * @return bool true if not a redirect
+ */
+ public function checkTouched() {
+ if ( !$this->mDataLoaded ) {
+ $this->loadPageData();
+ }
+ return !$this->mIsRedirect;
+ }
+
+ /**
+ * Get the page_touched field
+ * @return string Containing GMT timestamp
+ */
+ public function getTouched() {
+ if ( !$this->mDataLoaded ) {
+ $this->loadPageData();
+ }
+ return $this->mTouched;
+ }
+
+ /**
+ * Get the page_links_updated field
+ * @return string|null Containing GMT timestamp
+ */
+ public function getLinksTimestamp() {
+ if ( !$this->mDataLoaded ) {
+ $this->loadPageData();
+ }
+ return $this->mLinksUpdated;
+ }
+
+ /**
+ * Get the page_latest field
+ * @return int rev_id of current revision
+ */
+ public function getLatest() {
+ if ( !$this->mDataLoaded ) {
+ $this->loadPageData();
+ }
+ return (int)$this->mLatest;
+ }
+
+ /**
+ * Get the Revision object of the oldest revision
+ * @return Revision|null
+ */
+ public function getOldestRevision() {
+ wfProfileIn( __METHOD__ );
+
+ // Try using the slave database first, then try the master
+ $continue = 2;
+ $db = wfGetDB( DB_SLAVE );
+ $revSelectFields = Revision::selectFields();
+
+ $row = null;
+ while ( $continue ) {
+ $row = $db->selectRow(
+ array( 'page', 'revision' ),
+ $revSelectFields,
+ array(
+ 'page_namespace' => $this->mTitle->getNamespace(),
+ 'page_title' => $this->mTitle->getDBkey(),
+ 'rev_page = page_id'
+ ),
+ __METHOD__,
+ array(
+ 'ORDER BY' => 'rev_timestamp ASC'
+ )
+ );
+
+ if ( $row ) {
+ $continue = 0;
+ } else {
+ $db = wfGetDB( DB_MASTER );
+ $continue--;
+ }
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $row ? Revision::newFromRow( $row ) : null;
+ }
+
+ /**
+ * Loads everything except the text
+ * This isn't necessary for all uses, so it's only done if needed.
+ */
+ protected function loadLastEdit() {
+ if ( $this->mLastRevision !== null ) {
+ return; // already loaded
+ }
+
+ $latest = $this->getLatest();
+ if ( !$latest ) {
+ return; // page doesn't exist or is missing page_latest info
+ }
+
+ // Bug 37225: if session S1 loads the page row FOR UPDATE, the result always includes the
+ // latest changes committed. This is true even within REPEATABLE-READ transactions, where
+ // S1 normally only sees changes committed before the first S1 SELECT. Thus we need S1 to
+ // also gets the revision row FOR UPDATE; otherwise, it may not find it since a page row
+ // UPDATE and revision row INSERT by S2 may have happened after the first S1 SELECT.
+ // http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read.
+ $flags = ( $this->mDataLoadedFrom == self::READ_LOCKING ) ? Revision::READ_LOCKING : 0;
+ $revision = Revision::newFromPageId( $this->getId(), $latest, $flags );
+ if ( $revision ) { // sanity
+ $this->setLastEdit( $revision );
+ }
+ }
+
+ /**
+ * Set the latest revision
+ * @param Revision $revision
+ */
+ protected function setLastEdit( Revision $revision ) {
+ $this->mLastRevision = $revision;
+ $this->mTimestamp = $revision->getTimestamp();
+ }
+
+ /**
+ * Get the latest revision
+ * @return Revision|null
+ */
+ public function getRevision() {
+ $this->loadLastEdit();
+ if ( $this->mLastRevision ) {
+ return $this->mLastRevision;
+ }
+ return null;
+ }
+
+ /**
+ * Get the content of the current revision. No side-effects...
+ *
+ * @param int $audience int One of:
+ * Revision::FOR_PUBLIC to be displayed to all users
+ * Revision::FOR_THIS_USER to be displayed to $wgUser
+ * Revision::RAW get the text regardless of permissions
+ * @param User $user User object to check for, only if FOR_THIS_USER is passed
+ * to the $audience parameter
+ * @return Content|null The content of the current revision
+ *
+ * @since 1.21
+ */
+ public function getContent( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+ $this->loadLastEdit();
+ if ( $this->mLastRevision ) {
+ return $this->mLastRevision->getContent( $audience, $user );
+ }
+ return null;
+ }
+
+ /**
+ * Get the text of the current revision. No side-effects...
+ *
+ * @param int $audience One of:
+ * Revision::FOR_PUBLIC to be displayed to all users
+ * Revision::FOR_THIS_USER to be displayed to the given user
+ * Revision::RAW get the text regardless of permissions
+ * @param User $user User object to check for, only if FOR_THIS_USER is passed
+ * to the $audience parameter
+ * @return string|bool The text of the current revision
+ * @deprecated since 1.21, getContent() should be used instead.
+ */
+ public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+
+ $this->loadLastEdit();
+ if ( $this->mLastRevision ) {
+ return $this->mLastRevision->getText( $audience, $user );
+ }
+ return false;
+ }
+
+ /**
+ * Get the text of the current revision. No side-effects...
+ *
+ * @return string|bool The text of the current revision. False on failure
+ * @deprecated since 1.21, getContent() should be used instead.
+ */
+ public function getRawText() {
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+
+ return $this->getText( Revision::RAW );
+ }
+
+ /**
+ * @return string MW timestamp of last article revision
+ */
+ public function getTimestamp() {
+ // Check if the field has been filled by WikiPage::setTimestamp()
+ if ( !$this->mTimestamp ) {
+ $this->loadLastEdit();
+ }
+
+ return wfTimestamp( TS_MW, $this->mTimestamp );
+ }
+
+ /**
+ * Set the page timestamp (use only to avoid DB queries)
+ * @param string $ts MW timestamp of last article revision
+ * @return void
+ */
+ public function setTimestamp( $ts ) {
+ $this->mTimestamp = wfTimestamp( TS_MW, $ts );
+ }
+
+ /**
+ * @param int $audience One of:
+ * Revision::FOR_PUBLIC to be displayed to all users
+ * Revision::FOR_THIS_USER to be displayed to the given user
+ * Revision::RAW get the text regardless of permissions
+ * @param User $user User object to check for, only if FOR_THIS_USER is passed
+ * to the $audience parameter
+ * @return int user ID for the user that made the last article revision
+ */
+ public function getUser( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+ $this->loadLastEdit();
+ if ( $this->mLastRevision ) {
+ return $this->mLastRevision->getUser( $audience, $user );
+ } else {
+ return -1;
+ }
+ }
+
+ /**
+ * Get the User object of the user who created the page
+ * @param int $audience One of:
+ * Revision::FOR_PUBLIC to be displayed to all users
+ * Revision::FOR_THIS_USER to be displayed to the given user
+ * Revision::RAW get the text regardless of permissions
+ * @param User $user User object to check for, only if FOR_THIS_USER is passed
+ * to the $audience parameter
+ * @return User|null
+ */
+ public function getCreator( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+ $revision = $this->getOldestRevision();
+ if ( $revision ) {
+ $userName = $revision->getUserText( $audience, $user );
+ return User::newFromName( $userName, false );
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * @param int $audience One of:
+ * Revision::FOR_PUBLIC to be displayed to all users
+ * Revision::FOR_THIS_USER to be displayed to the given user
+ * Revision::RAW get the text regardless of permissions
+ * @param User $user User object to check for, only if FOR_THIS_USER is passed
+ * to the $audience parameter
+ * @return string username of the user that made the last article revision
+ */
+ public function getUserText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+ $this->loadLastEdit();
+ if ( $this->mLastRevision ) {
+ return $this->mLastRevision->getUserText( $audience, $user );
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * @param int $audience One of:
+ * Revision::FOR_PUBLIC to be displayed to all users
+ * Revision::FOR_THIS_USER to be displayed to the given user
+ * Revision::RAW get the text regardless of permissions
+ * @param User $user User object to check for, only if FOR_THIS_USER is passed
+ * to the $audience parameter
+ * @return string Comment stored for the last article revision
+ */
+ public function getComment( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+ $this->loadLastEdit();
+ if ( $this->mLastRevision ) {
+ return $this->mLastRevision->getComment( $audience, $user );
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Returns true if last revision was marked as "minor edit"
+ *
+ * @return bool Minor edit indicator for the last article revision.
+ */
+ public function getMinorEdit() {
+ $this->loadLastEdit();
+ if ( $this->mLastRevision ) {
+ return $this->mLastRevision->isMinor();
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Get the cached timestamp for the last time the page changed.
+ * This is only used to help handle slave lag by comparing to page_touched.
+ * @return string MW timestamp
+ */
+ protected function getCachedLastEditTime() {
+ global $wgMemc;
+ $key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
+ return $wgMemc->get( $key );
+ }
+
+ /**
+ * Set the cached timestamp for the last time the page changed.
+ * This is only used to help handle slave lag by comparing to page_touched.
+ * @param string $timestamp
+ * @return void
+ */
+ public function setCachedLastEditTime( $timestamp ) {
+ global $wgMemc;
+ $key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
+ $wgMemc->set( $key, wfTimestamp( TS_MW, $timestamp ), 60 * 15 );
+ }
+
+ /**
+ * Determine whether a page would be suitable for being counted as an
+ * article in the site_stats table based on the title & its content
+ *
+ * @param object|bool $editInfo (false): object returned by prepareTextForEdit(),
+ * if false, the current database state will be used
+ * @return bool
+ */
+ public function isCountable( $editInfo = false ) {
+ global $wgArticleCountMethod;
+
+ if ( !$this->mTitle->isContentPage() ) {
+ return false;
+ }
+
+ if ( $editInfo ) {
+ $content = $editInfo->pstContent;
+ } else {
+ $content = $this->getContent();
+ }
+
+ if ( !$content || $content->isRedirect() ) {
+ return false;
+ }
+
+ $hasLinks = null;
+
+ if ( $wgArticleCountMethod === 'link' ) {
+ // nasty special case to avoid re-parsing to detect links
+
+ if ( $editInfo ) {
+ // ParserOutput::getLinks() is a 2D array of page links, so
+ // to be really correct we would need to recurse in the array
+ // but the main array should only have items in it if there are
+ // links.
+ $hasLinks = (bool)count( $editInfo->output->getLinks() );
+ } else {
+ $hasLinks = (bool)wfGetDB( DB_SLAVE )->selectField( 'pagelinks', 1,
+ array( 'pl_from' => $this->getId() ), __METHOD__ );
+ }
+ }
+
+ return $content->isCountable( $hasLinks );
+ }
+
+ /**
+ * If this page is a redirect, get its target
+ *
+ * The target will be fetched from the redirect table if possible.
+ * If this page doesn't have an entry there, call insertRedirect()
+ * @return Title|null Title object, or null if this page is not a redirect
+ */
+ public function getRedirectTarget() {
+ if ( !$this->mTitle->isRedirect() ) {
+ return null;
+ }
+
+ if ( $this->mRedirectTarget !== null ) {
+ return $this->mRedirectTarget;
+ }
+
+ // Query the redirect table
+ $dbr = wfGetDB( DB_SLAVE );
+ $row = $dbr->selectRow( 'redirect',
+ array( 'rd_namespace', 'rd_title', 'rd_fragment', 'rd_interwiki' ),
+ array( 'rd_from' => $this->getId() ),
+ __METHOD__
+ );
+
+ // rd_fragment and rd_interwiki were added later, populate them if empty
+ if ( $row && !is_null( $row->rd_fragment ) && !is_null( $row->rd_interwiki ) ) {
+ $this->mRedirectTarget = Title::makeTitle(
+ $row->rd_namespace, $row->rd_title,
+ $row->rd_fragment, $row->rd_interwiki );
+ return $this->mRedirectTarget;
+ }
+
+ // This page doesn't have an entry in the redirect table
+ $this->mRedirectTarget = $this->insertRedirect();
+ return $this->mRedirectTarget;
+ }
+
+ /**
+ * Insert an entry for this page into the redirect table.
+ *
+ * Don't call this function directly unless you know what you're doing.
+ * @return Title|null Title object or null if not a redirect
+ */
+ public function insertRedirect() {
+ // recurse through to only get the final target
+ $content = $this->getContent();
+ $retval = $content ? $content->getUltimateRedirectTarget() : null;
+ if ( !$retval ) {
+ return null;
+ }
+ $this->insertRedirectEntry( $retval );
+ return $retval;
+ }
+
+ /**
+ * Insert or update the redirect table entry for this page to indicate
+ * it redirects to $rt .
+ * @param Title $rt Redirect target
+ */
+ public function insertRedirectEntry( $rt ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->replace( 'redirect', array( 'rd_from' ),
+ array(
+ 'rd_from' => $this->getId(),
+ 'rd_namespace' => $rt->getNamespace(),
+ 'rd_title' => $rt->getDBkey(),
+ 'rd_fragment' => $rt->getFragment(),
+ 'rd_interwiki' => $rt->getInterwiki(),
+ ),
+ __METHOD__
+ );
+ }
+
+ /**
+ * Get the Title object or URL this page redirects to
+ *
+ * @return bool|Title|string false, Title of in-wiki target, or string with URL
+ */
+ public function followRedirect() {
+ return $this->getRedirectURL( $this->getRedirectTarget() );
+ }
+
+ /**
+ * Get the Title object or URL to use for a redirect. We use Title
+ * objects for same-wiki, non-special redirects and URLs for everything
+ * else.
+ * @param Title $rt Redirect target
+ * @return bool|Title|string false, Title object of local target, or string with URL
+ */
+ public function getRedirectURL( $rt ) {
+ if ( !$rt ) {
+ return false;
+ }
+
+ if ( $rt->isExternal() ) {
+ if ( $rt->isLocal() ) {
+ // Offsite wikis need an HTTP redirect.
+ //
+ // This can be hard to reverse and may produce loops,
+ // so they may be disabled in the site configuration.
+ $source = $this->mTitle->getFullURL( 'redirect=no' );
+ return $rt->getFullURL( array( 'rdfrom' => $source ) );
+ } else {
+ // External pages pages without "local" bit set are not valid
+ // redirect targets
+ return false;
+ }
+ }
+
+ if ( $rt->isSpecialPage() ) {
+ // Gotta handle redirects to special pages differently:
+ // Fill the HTTP response "Location" header and ignore
+ // the rest of the page we're on.
+ //
+ // Some pages are not valid targets
+ if ( $rt->isValidRedirectTarget() ) {
+ return $rt->getFullURL();
+ } else {
+ return false;
+ }
+ }
+
+ return $rt;
+ }
+
+ /**
+ * Get a list of users who have edited this article, not including the user who made
+ * the most recent revision, which you can get from $article->getUser() if you want it
+ * @return UserArrayFromResult
+ */
+ public function getContributors() {
+ // @todo FIXME: This is expensive; cache this info somewhere.
+
+ $dbr = wfGetDB( DB_SLAVE );
+
+ if ( $dbr->implicitGroupby() ) {
+ $realNameField = 'user_real_name';
+ } else {
+ $realNameField = 'MIN(user_real_name) AS user_real_name';
+ }
+
+ $tables = array( 'revision', 'user' );
+
+ $fields = array(
+ 'user_id' => 'rev_user',
+ 'user_name' => 'rev_user_text',
+ $realNameField,
+ 'timestamp' => 'MAX(rev_timestamp)',
+ );
+
+ $conds = array( 'rev_page' => $this->getId() );
+
+ // The user who made the top revision gets credited as "this page was last edited by
+ // John, based on contributions by Tom, Dick and Harry", so don't include them twice.
+ $user = $this->getUser();
+ if ( $user ) {
+ $conds[] = "rev_user != $user";
+ } else {
+ $conds[] = "rev_user_text != {$dbr->addQuotes( $this->getUserText() )}";
+ }
+
+ $conds[] = "{$dbr->bitAnd( 'rev_deleted', Revision::DELETED_USER )} = 0"; // username hidden?
+
+ $jconds = array(
+ 'user' => array( 'LEFT JOIN', 'rev_user = user_id' ),
+ );
+
+ $options = array(
+ 'GROUP BY' => array( 'rev_user', 'rev_user_text' ),
+ 'ORDER BY' => 'timestamp DESC',
+ );
+
+ $res = $dbr->select( $tables, $fields, $conds, __METHOD__, $options, $jconds );
+ return new UserArrayFromResult( $res );
+ }
+
+ /**
+ * Get the last N authors
+ * @param int $num Number of revisions to get
+ * @param int|string $revLatest The latest rev_id, selected from the master (optional)
+ * @return array Array of authors, duplicates not removed
+ */
+ public function getLastNAuthors( $num, $revLatest = 0 ) {
+ wfProfileIn( __METHOD__ );
+ // First try the slave
+ // If that doesn't have the latest revision, try the master
+ $continue = 2;
+ $db = wfGetDB( DB_SLAVE );
+
+ do {
+ $res = $db->select( array( 'page', 'revision' ),
+ array( 'rev_id', 'rev_user_text' ),
+ array(
+ 'page_namespace' => $this->mTitle->getNamespace(),
+ 'page_title' => $this->mTitle->getDBkey(),
+ 'rev_page = page_id'
+ ), __METHOD__,
+ array(
+ 'ORDER BY' => 'rev_timestamp DESC',
+ 'LIMIT' => $num
+ )
+ );
+
+ if ( !$res ) {
+ wfProfileOut( __METHOD__ );
+ return array();
+ }
+
+ $row = $db->fetchObject( $res );
+
+ if ( $continue == 2 && $revLatest && $row->rev_id != $revLatest ) {
+ $db = wfGetDB( DB_MASTER );
+ $continue--;
+ } else {
+ $continue = 0;
+ }
+ } while ( $continue );
+
+ $authors = array( $row->rev_user_text );
+
+ foreach ( $res as $row ) {
+ $authors[] = $row->rev_user_text;
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $authors;
+ }
+
+ /**
+ * Should the parser cache be used?
+ *
+ * @param ParserOptions $parserOptions ParserOptions to check
+ * @param int $oldid
+ * @return bool
+ */
+ public function isParserCacheUsed( ParserOptions $parserOptions, $oldid ) {
+ global $wgEnableParserCache;
+
+ return $wgEnableParserCache
+ && $parserOptions->getStubThreshold() == 0
+ && $this->exists()
+ && ( $oldid === null || $oldid === 0 || $oldid === $this->getLatest() )
+ && $this->getContentHandler()->isParserCacheSupported();
+ }
+
+ /**
+ * Get a ParserOutput for the given ParserOptions and revision ID.
+ * The parser cache will be used if possible.
+ *
+ * @since 1.19
+ * @param ParserOptions $parserOptions ParserOptions to use for the parse operation
+ * @param null|int $oldid Revision ID to get the text from, passing null or 0 will
+ * get the current revision (default value)
+ *
+ * @return ParserOutput|bool ParserOutput or false if the revision was not found
+ */
+ public function getParserOutput( ParserOptions $parserOptions, $oldid = null ) {
+ wfProfileIn( __METHOD__ );
+
+ $useParserCache = $this->isParserCacheUsed( $parserOptions, $oldid );
+ wfDebug( __METHOD__ . ': using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
+ if ( $parserOptions->getStubThreshold() ) {
+ wfIncrStats( 'pcache_miss_stub' );
+ }
+
+ if ( $useParserCache ) {
+ $parserOutput = ParserCache::singleton()->get( $this, $parserOptions );
+ if ( $parserOutput !== false ) {
+ wfProfileOut( __METHOD__ );
+ return $parserOutput;
+ }
+ }
+
+ if ( $oldid === null || $oldid === 0 ) {
+ $oldid = $this->getLatest();
+ }
+
+ $pool = new PoolWorkArticleView( $this, $parserOptions, $oldid, $useParserCache );
+ $pool->execute();
+
+ wfProfileOut( __METHOD__ );
+
+ return $pool->getParserOutput();
+ }
+
+ /**
+ * Do standard deferred updates after page view (existing or missing page)
+ * @param User $user The relevant user
+ * @param int $oldid The revision id being viewed. If not given or 0, latest revision is assumed.
+ */
+ public function doViewUpdates( User $user, $oldid = 0 ) {
+ global $wgDisableCounters;
+ if ( wfReadOnly() ) {
+ return;
+ }
+
+ // Don't update page view counters on views from bot users (bug 14044)
+ if ( !$wgDisableCounters && !$user->isAllowed( 'bot' ) && $this->exists() ) {
+ DeferredUpdates::addUpdate( new ViewCountUpdate( $this->getId() ) );
+ DeferredUpdates::addUpdate( new SiteStatsUpdate( 1, 0, 0 ) );
+ }
+
+ // Update newtalk / watchlist notification status
+ $user->clearNotification( $this->mTitle, $oldid );
+ }
+
+ /**
+ * Perform the actions of a page purging
+ * @return bool
+ */
+ public function doPurge() {
+ global $wgUseSquid;
+
+ if ( !wfRunHooks( 'ArticlePurge', array( &$this ) ) ) {
+ return false;
+ }
+
+ // Invalidate the cache
+ $this->mTitle->invalidateCache();
+
+ if ( $wgUseSquid ) {
+ // Commit the transaction before the purge is sent
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->commit( __METHOD__ );
+
+ // Send purge
+ $update = SquidUpdate::newSimplePurge( $this->mTitle );
+ $update->doUpdate();
+ }
+
+ if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
+ // @todo move this logic to MessageCache
+
+ if ( $this->exists() ) {
+ // NOTE: use transclusion text for messages.
+ // This is consistent with MessageCache::getMsgFromNamespace()
+
+ $content = $this->getContent();
+ $text = $content === null ? null : $content->getWikitextForTransclusion();
+
+ if ( $text === null ) {
+ $text = false;
+ }
+ } else {
+ $text = false;
+ }
+
+ MessageCache::singleton()->replace( $this->mTitle->getDBkey(), $text );
+ }
+ return true;
+ }
+
+ /**
+ * Insert a new empty page record for this article.
+ * This *must* be followed up by creating a revision
+ * and running $this->updateRevisionOn( ... );
+ * or else the record will be left in a funky state.
+ * Best if all done inside a transaction.
+ *
+ * @param DatabaseBase $dbw
+ * @return int The newly created page_id key, or false if the title already existed
+ */
+ public function insertOn( $dbw ) {
+ wfProfileIn( __METHOD__ );
+
+ $page_id = $dbw->nextSequenceValue( 'page_page_id_seq' );
+ $dbw->insert( 'page', array(
+ 'page_id' => $page_id,
+ 'page_namespace' => $this->mTitle->getNamespace(),
+ 'page_title' => $this->mTitle->getDBkey(),
+ 'page_counter' => 0,
+ 'page_restrictions' => '',
+ 'page_is_redirect' => 0, // Will set this shortly...
+ 'page_is_new' => 1,
+ 'page_random' => wfRandom(),
+ 'page_touched' => $dbw->timestamp(),
+ 'page_latest' => 0, // Fill this in shortly...
+ 'page_len' => 0, // Fill this in shortly...
+ ), __METHOD__, 'IGNORE' );
+
+ $affected = $dbw->affectedRows();
+
+ if ( $affected ) {
+ $newid = $dbw->insertId();
+ $this->mId = $newid;
+ $this->mTitle->resetArticleID( $newid );
+ }
+ wfProfileOut( __METHOD__ );
+
+ return $affected ? $newid : false;
+ }
+
+ /**
+ * Update the page record to point to a newly saved revision.
+ *
+ * @param DatabaseBase $dbw
+ * @param Revision $revision For ID number, and text used to set
+ * length and redirect status fields
+ * @param int $lastRevision If given, will not overwrite the page field
+ * when different from the currently set value.
+ * Giving 0 indicates the new page flag should be set on.
+ * @param bool $lastRevIsRedirect If given, will optimize adding and
+ * removing rows in redirect table.
+ * @return bool true on success, false on failure
+ */
+ public function updateRevisionOn( $dbw, $revision, $lastRevision = null,
+ $lastRevIsRedirect = null
+ ) {
+ global $wgContentHandlerUseDB;
+
+ wfProfileIn( __METHOD__ );
+
+ $content = $revision->getContent();
+ $len = $content ? $content->getSize() : 0;
+ $rt = $content ? $content->getUltimateRedirectTarget() : null;
+
+ $conditions = array( 'page_id' => $this->getId() );
+
+ if ( !is_null( $lastRevision ) ) {
+ // An extra check against threads stepping on each other
+ $conditions['page_latest'] = $lastRevision;
+ }
+
+ $now = wfTimestampNow();
+ $row = array( /* SET */
+ 'page_latest' => $revision->getId(),
+ 'page_touched' => $dbw->timestamp( $now ),
+ 'page_is_new' => ( $lastRevision === 0 ) ? 1 : 0,
+ 'page_is_redirect' => $rt !== null ? 1 : 0,
+ 'page_len' => $len,
+ );
+
+ if ( $wgContentHandlerUseDB ) {
+ $row['page_content_model'] = $revision->getContentModel();
+ }
+
+ $dbw->update( 'page',
+ $row,
+ $conditions,
+ __METHOD__ );
+
+ $result = $dbw->affectedRows() > 0;
+ if ( $result ) {
+ $this->updateRedirectOn( $dbw, $rt, $lastRevIsRedirect );
+ $this->setLastEdit( $revision );
+ $this->setCachedLastEditTime( $now );
+ $this->mLatest = $revision->getId();
+ $this->mIsRedirect = (bool)$rt;
+ // Update the LinkCache.
+ LinkCache::singleton()->addGoodLinkObj( $this->getId(), $this->mTitle, $len, $this->mIsRedirect,
+ $this->mLatest, $revision->getContentModel() );
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $result;
+ }
+
+ /**
+ * Add row to the redirect table if this is a redirect, remove otherwise.
+ *
+ * @param DatabaseBase $dbw
+ * @param Title $redirectTitle Title object pointing to the redirect target,
+ * or NULL if this is not a redirect
+ * @param null|bool $lastRevIsRedirect If given, will optimize adding and
+ * removing rows in redirect table.
+ * @return bool true on success, false on failure
+ * @private
+ */
+ public function updateRedirectOn( $dbw, $redirectTitle, $lastRevIsRedirect = null ) {
+ // Always update redirects (target link might have changed)
+ // Update/Insert if we don't know if the last revision was a redirect or not
+ // Delete if changing from redirect to non-redirect
+ $isRedirect = !is_null( $redirectTitle );
+
+ if ( !$isRedirect && $lastRevIsRedirect === false ) {
+ return true;
+ }
+
+ wfProfileIn( __METHOD__ );
+ if ( $isRedirect ) {
+ $this->insertRedirectEntry( $redirectTitle );
+ } else {
+ // This is not a redirect, remove row from redirect table
+ $where = array( 'rd_from' => $this->getId() );
+ $dbw->delete( 'redirect', $where, __METHOD__ );
+ }
+
+ if ( $this->getTitle()->getNamespace() == NS_FILE ) {
+ RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $this->getTitle() );
+ }
+ wfProfileOut( __METHOD__ );
+
+ return ( $dbw->affectedRows() != 0 );
+ }
+
+ /**
+ * If the given revision is newer than the currently set page_latest,
+ * update the page record. Otherwise, do nothing.
+ *
+ * @deprecated since 1.24, use updateRevisionOn instead
+ *
+ * @param DatabaseBase $dbw
+ * @param Revision $revision
+ * @return bool
+ */
+ public function updateIfNewerOn( $dbw, $revision ) {
+ wfProfileIn( __METHOD__ );
+
+ $row = $dbw->selectRow(
+ array( 'revision', 'page' ),
+ array( 'rev_id', 'rev_timestamp', 'page_is_redirect' ),
+ array(
+ 'page_id' => $this->getId(),
+ 'page_latest=rev_id' ),
+ __METHOD__ );
+
+ if ( $row ) {
+ if ( wfTimestamp( TS_MW, $row->rev_timestamp ) >= $revision->getTimestamp() ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+ $prev = $row->rev_id;
+ $lastRevIsRedirect = (bool)$row->page_is_redirect;
+ } else {
+ // No or missing previous revision; mark the page as new
+ $prev = 0;
+ $lastRevIsRedirect = null;
+ }
+
+ $ret = $this->updateRevisionOn( $dbw, $revision, $prev, $lastRevIsRedirect );
+
+ wfProfileOut( __METHOD__ );
+ return $ret;
+ }
+
+ /**
+ * Get the content that needs to be saved in order to undo all revisions
+ * between $undo and $undoafter. Revisions must belong to the same page,
+ * must exist and must not be deleted
+ * @param Revision $undo
+ * @param Revision $undoafter Must be an earlier revision than $undo
+ * @return mixed string on success, false on failure
+ * @since 1.21
+ * Before we had the Content object, this was done in getUndoText
+ */
+ public function getUndoContent( Revision $undo, Revision $undoafter = null ) {
+ $handler = $undo->getContentHandler();
+ return $handler->getUndoContent( $this->getRevision(), $undo, $undoafter );
+ }
+
+ /**
+ * Get the text that needs to be saved in order to undo all revisions
+ * between $undo and $undoafter. Revisions must belong to the same page,
+ * must exist and must not be deleted
+ * @param Revision $undo
+ * @param Revision $undoafter Must be an earlier revision than $undo
+ * @return string|bool string on success, false on failure
+ * @deprecated since 1.21: use ContentHandler::getUndoContent() instead.
+ */
+ public function getUndoText( Revision $undo, Revision $undoafter = null ) {
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+
+ $this->loadLastEdit();
+
+ if ( $this->mLastRevision ) {
+ if ( is_null( $undoafter ) ) {
+ $undoafter = $undo->getPrevious();
+ }
+
+ $handler = $this->getContentHandler();
+ $undone = $handler->getUndoContent( $this->mLastRevision, $undo, $undoafter );
+
+ if ( !$undone ) {
+ return false;
+ } else {
+ return ContentHandler::getContentText( $undone );
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @param string|number|null|bool $sectionId Section identifier as a number or string
+ * (e.g. 0, 1 or 'T-1'), null/false or an empty string for the whole page
+ * or 'new' for a new section.
+ * @param string $text New text of the section.
+ * @param string $sectionTitle New section's subject, only if $section is "new".
+ * @param string $edittime Revision timestamp or null to use the current revision.
+ *
+ * @throws MWException
+ * @return string New complete article text, or null if error.
+ *
+ * @deprecated since 1.21, use replaceSectionAtRev() instead
+ */
+ public function replaceSection( $sectionId, $text, $sectionTitle = '',
+ $edittime = null
+ ) {
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+
+ //NOTE: keep condition in sync with condition in replaceSectionContent!
+ if ( strval( $sectionId ) === '' ) {
+ // Whole-page edit; let the whole text through
+ return $text;
+ }
+
+ if ( !$this->supportsSections() ) {
+ throw new MWException( "sections not supported for content model " .
+ $this->getContentHandler()->getModelID() );
+ }
+
+ // could even make section title, but that's not required.
+ $sectionContent = ContentHandler::makeContent( $text, $this->getTitle() );
+
+ $newContent = $this->replaceSectionContent( $sectionId, $sectionContent, $sectionTitle,
+ $edittime );
+
+ return ContentHandler::getContentText( $newContent );
+ }
+
+ /**
+ * Returns true if this page's content model supports sections.
+ *
+ * @return bool
+ *
+ * @todo The skin should check this and not offer section functionality if
+ * sections are not supported.
+ * @todo The EditPage should check this and not offer section functionality
+ * if sections are not supported.
+ */
+ public function supportsSections() {
+ return $this->getContentHandler()->supportsSections();
+ }
+
+ /**
+ * @param string|number|null|bool $sectionId Section identifier as a number or string
+ * (e.g. 0, 1 or 'T-1'), null/false or an empty string for the whole page
+ * or 'new' for a new section.
+ * @param Content $sectionContent New content of the section.
+ * @param string $sectionTitle New section's subject, only if $section is "new".
+ * @param string $edittime Revision timestamp or null to use the current revision.
+ *
+ * @throws MWException
+ * @return Content New complete article content, or null if error.
+ *
+ * @since 1.21
+ * @deprecated since 1.24, use replaceSectionAtRev instead
+ */
+ public function replaceSectionContent( $sectionId, Content $sectionContent, $sectionTitle = '',
+ $edittime = null ) {
+ wfProfileIn( __METHOD__ );
+
+ $baseRevId = null;
+ if ( $edittime && $sectionId !== 'new' ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $rev = Revision::loadFromTimestamp( $dbw, $this->mTitle, $edittime );
+ if ( $rev ) {
+ $baseRevId = $rev->getId();
+ }
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $this->replaceSectionAtRev( $sectionId, $sectionContent, $sectionTitle, $baseRevId );
+ }
+
+ /**
+ * @param string|number|null|bool $sectionId Section identifier as a number or string
+ * (e.g. 0, 1 or 'T-1'), null/false or an empty string for the whole page
+ * or 'new' for a new section.
+ * @param Content $sectionContent New content of the section.
+ * @param string $sectionTitle New section's subject, only if $section is "new".
+ * @param string $baseRevId integer|null
+ *
+ * @throws MWException
+ * @return Content New complete article content, or null if error.
+ *
+ * @since 1.24
+ */
+ public function replaceSectionAtRev( $sectionId, Content $sectionContent,
+ $sectionTitle = '', $baseRevId = null
+ ) {
+ wfProfileIn( __METHOD__ );
+
+ if ( strval( $sectionId ) === '' ) {
+ // Whole-page edit; let the whole text through
+ $newContent = $sectionContent;
+ } else {
+ if ( !$this->supportsSections() ) {
+ wfProfileOut( __METHOD__ );
+ throw new MWException( "sections not supported for content model " .
+ $this->getContentHandler()->getModelID() );
+ }
+
+ // Bug 30711: always use current version when adding a new section
+ if ( is_null( $baseRevId ) || $sectionId === 'new' ) {
+ $oldContent = $this->getContent();
+ } else {
+ // TODO: try DB_SLAVE first
+ $dbw = wfGetDB( DB_MASTER );
+ $rev = Revision::loadFromId( $dbw, $baseRevId );
+
+ if ( !$rev ) {
+ wfDebug( __METHOD__ . " asked for bogus section (page: " .
+ $this->getId() . "; section: $sectionId)\n" );
+ wfProfileOut( __METHOD__ );
+ return null;
+ }
+
+ $oldContent = $rev->getContent();
+ }
+
+ if ( ! $oldContent ) {
+ wfDebug( __METHOD__ . ": no page text\n" );
+ wfProfileOut( __METHOD__ );
+ return null;
+ }
+
+ $newContent = $oldContent->replaceSection( $sectionId, $sectionContent, $sectionTitle );
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $newContent;
+ }
+
+ /**
+ * Check flags and add EDIT_NEW or EDIT_UPDATE to them as needed.
+ * @param int $flags
+ * @return int Updated $flags
+ */
+ public function checkFlags( $flags ) {
+ if ( !( $flags & EDIT_NEW ) && !( $flags & EDIT_UPDATE ) ) {
+ if ( $this->exists() ) {
+ $flags |= EDIT_UPDATE;
+ } else {
+ $flags |= EDIT_NEW;
+ }
+ }
+
+ return $flags;
+ }
+
+ /**
+ * Change an existing article or create a new article. Updates RC and all necessary caches,
+ * optionally via the deferred update array.
+ *
+ * @param string $text New text
+ * @param string $summary Edit summary
+ * @param int $flags Bitfield:
+ * EDIT_NEW
+ * Article is known or assumed to be non-existent, create a new one
+ * EDIT_UPDATE
+ * Article is known or assumed to be pre-existing, update it
+ * EDIT_MINOR
+ * Mark this edit minor, if the user is allowed to do so
+ * EDIT_SUPPRESS_RC
+ * Do not log the change in recentchanges
+ * EDIT_FORCE_BOT
+ * Mark the edit a "bot" edit regardless of user rights
+ * EDIT_DEFER_UPDATES
+ * Defer some of the updates until the end of index.php
+ * EDIT_AUTOSUMMARY
+ * Fill in blank summaries with generated text where possible
+ *
+ * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the
+ * article will be detected. If EDIT_UPDATE is specified and the article
+ * doesn't exist, the function will return an edit-gone-missing error. If
+ * EDIT_NEW is specified and the article does exist, an edit-already-exists
+ * error will be returned. These two conditions are also possible with
+ * auto-detection due to MediaWiki's performance-optimised locking strategy.
+ *
+ * @param bool|int $baseRevId The revision ID this edit was based off, if any
+ * @param User $user The user doing the edit
+ *
+ * @throws MWException
+ * @return Status object. Possible errors:
+ * edit-hook-aborted: The ArticleSave hook aborted the edit but didn't
+ * set the fatal flag of $status
+ * edit-gone-missing: In update mode, but the article didn't exist.
+ * edit-conflict: In update mode, the article changed unexpectedly.
+ * edit-no-change: Warning that the text was the same as before.
+ * edit-already-exists: In creation mode, but the article already exists.
+ *
+ * Extensions may define additional errors.
+ *
+ * $return->value will contain an associative array with members as follows:
+ * new: Boolean indicating if the function attempted to create a new article.
+ * revision: The revision object for the inserted revision, or null.
+ *
+ * Compatibility note: this function previously returned a boolean value
+ * indicating success/failure
+ *
+ * @deprecated since 1.21: use doEditContent() instead.
+ */
+ public function doEdit( $text, $summary, $flags = 0, $baseRevId = false, $user = null ) {
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+
+ $content = ContentHandler::makeContent( $text, $this->getTitle() );
+
+ return $this->doEditContent( $content, $summary, $flags, $baseRevId, $user );
+ }
+
+ /**
+ * Change an existing article or create a new article. Updates RC and all necessary caches,
+ * optionally via the deferred update array.
+ *
+ * @param Content $content New content
+ * @param string $summary Edit summary
+ * @param int $flags Bitfield:
+ * EDIT_NEW
+ * Article is known or assumed to be non-existent, create a new one
+ * EDIT_UPDATE
+ * Article is known or assumed to be pre-existing, update it
+ * EDIT_MINOR
+ * Mark this edit minor, if the user is allowed to do so
+ * EDIT_SUPPRESS_RC
+ * Do not log the change in recentchanges
+ * EDIT_FORCE_BOT
+ * Mark the edit a "bot" edit regardless of user rights
+ * EDIT_DEFER_UPDATES
+ * Defer some of the updates until the end of index.php
+ * EDIT_AUTOSUMMARY
+ * Fill in blank summaries with generated text where possible
+ *
+ * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the
+ * article will be detected. If EDIT_UPDATE is specified and the article
+ * doesn't exist, the function will return an edit-gone-missing error. If
+ * EDIT_NEW is specified and the article does exist, an edit-already-exists
+ * error will be returned. These two conditions are also possible with
+ * auto-detection due to MediaWiki's performance-optimised locking strategy.
+ *
+ * @param bool|int $baseRevId The revision ID this edit was based off, if any
+ * @param User $user The user doing the edit
+ * @param string $serialisation_format Format for storing the content in the
+ * database.
+ *
+ * @throws MWException
+ * @return Status object. Possible errors:
+ * edit-hook-aborted: The ArticleSave hook aborted the edit but didn't
+ * set the fatal flag of $status.
+ * edit-gone-missing: In update mode, but the article didn't exist.
+ * edit-conflict: In update mode, the article changed unexpectedly.
+ * edit-no-change: Warning that the text was the same as before.
+ * edit-already-exists: In creation mode, but the article already exists.
+ *
+ * Extensions may define additional errors.
+ *
+ * $return->value will contain an associative array with members as follows:
+ * new: Boolean indicating if the function attempted to create a new article.
+ * revision: The revision object for the inserted revision, or null.
+ *
+ * @since 1.21
+ */
+ public function doEditContent( Content $content, $summary, $flags = 0, $baseRevId = false,
+ User $user = null, $serialisation_format = null
+ ) {
+ global $wgUser, $wgUseAutomaticEditSummaries, $wgUseRCPatrol, $wgUseNPPatrol;
+
+ // Low-level sanity check
+ if ( $this->mTitle->getText() === '' ) {
+ throw new MWException( 'Something is trying to edit an article with an empty title' );
+ }
+
+ wfProfileIn( __METHOD__ );
+
+ if ( !$content->getContentHandler()->canBeUsedOn( $this->getTitle() ) ) {
+ wfProfileOut( __METHOD__ );
+ return Status::newFatal( 'content-not-allowed-here',
+ ContentHandler::getLocalizedName( $content->getModel() ),
+ $this->getTitle()->getPrefixedText() );
+ }
+
+ $user = is_null( $user ) ? $wgUser : $user;
+ $status = Status::newGood( array() );
+
+ // Load the data from the master database if needed.
+ // The caller may already loaded it from the master or even loaded it using
+ // SELECT FOR UPDATE, so do not override that using clear().
+ $this->loadPageData( 'fromdbmaster' );
+
+ $flags = $this->checkFlags( $flags );
+
+ // handle hook
+ $hook_args = array( &$this, &$user, &$content, &$summary,
+ $flags & EDIT_MINOR, null, null, &$flags, &$status );
+
+ if ( !wfRunHooks( 'PageContentSave', $hook_args )
+ || !ContentHandler::runLegacyHooks( 'ArticleSave', $hook_args ) ) {
+
+ wfDebug( __METHOD__ . ": ArticleSave or ArticleSaveContent hook aborted save!\n" );
+
+ if ( $status->isOK() ) {
+ $status->fatal( 'edit-hook-aborted' );
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ // Silently ignore EDIT_MINOR if not allowed
+ $isminor = ( $flags & EDIT_MINOR ) && $user->isAllowed( 'minoredit' );
+ $bot = $flags & EDIT_FORCE_BOT;
+
+ $old_content = $this->getContent( Revision::RAW ); // current revision's content
+
+ $oldsize = $old_content ? $old_content->getSize() : 0;
+ $oldid = $this->getLatest();
+ $oldIsRedirect = $this->isRedirect();
+ $oldcountable = $this->isCountable();
+
+ $handler = $content->getContentHandler();
+
+ // Provide autosummaries if one is not provided and autosummaries are enabled.
+ if ( $wgUseAutomaticEditSummaries && $flags & EDIT_AUTOSUMMARY && $summary == '' ) {
+ if ( !$old_content ) {
+ $old_content = null;
+ }
+ $summary = $handler->getAutosummary( $old_content, $content, $flags );
+ }
+
+ $editInfo = $this->prepareContentForEdit( $content, null, $user, $serialisation_format );
+ $serialized = $editInfo->pst;
+
+ /**
+ * @var Content $content
+ */
+ $content = $editInfo->pstContent;
+ $newsize = $content->getSize();
+
+ $dbw = wfGetDB( DB_MASTER );
+ $now = wfTimestampNow();
+ $this->mTimestamp = $now;
+
+ if ( $flags & EDIT_UPDATE ) {
+ // Update article, but only if changed.
+ $status->value['new'] = false;
+
+ if ( !$oldid ) {
+ // Article gone missing
+ wfDebug( __METHOD__ . ": EDIT_UPDATE specified but article doesn't exist\n" );
+ $status->fatal( 'edit-gone-missing' );
+
+ wfProfileOut( __METHOD__ );
+ return $status;
+ } elseif ( !$old_content ) {
+ // Sanity check for bug 37225
+ wfProfileOut( __METHOD__ );
+ throw new MWException( "Could not find text for current revision {$oldid}." );
+ }
+
+ $revision = new Revision( array(
+ 'page' => $this->getId(),
+ 'title' => $this->getTitle(), // for determining the default content model
+ 'comment' => $summary,
+ 'minor_edit' => $isminor,
+ 'text' => $serialized,
+ 'len' => $newsize,
+ 'parent_id' => $oldid,
+ 'user' => $user->getId(),
+ 'user_text' => $user->getName(),
+ 'timestamp' => $now,
+ 'content_model' => $content->getModel(),
+ 'content_format' => $serialisation_format,
+ ) ); // XXX: pass content object?!
+
+ $changed = !$content->equals( $old_content );
+
+ if ( $changed ) {
+ if ( !$content->isValid() ) {
+ wfProfileOut( __METHOD__ );
+ throw new MWException( "New content failed validity check!" );
+ }
+
+ $dbw->begin( __METHOD__ );
+ try {
+
+ $prepStatus = $content->prepareSave( $this, $flags, $baseRevId, $user );
+ $status->merge( $prepStatus );
+
+ if ( !$status->isOK() ) {
+ $dbw->rollback( __METHOD__ );
+
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+ $revisionId = $revision->insertOn( $dbw );
+
+ // Update page
+ //
+ // We check for conflicts by comparing $oldid with the current latest revision ID.
+ $ok = $this->updateRevisionOn( $dbw, $revision, $oldid, $oldIsRedirect );
+
+ if ( !$ok ) {
+ // Belated edit conflict! Run away!!
+ $status->fatal( 'edit-conflict' );
+
+ $dbw->rollback( __METHOD__ );
+
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, $baseRevId, $user ) );
+ // Update recentchanges
+ if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
+ // Mark as patrolled if the user can do so
+ $patrolled = $wgUseRCPatrol && !count(
+ $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
+ // Add RC row to the DB
+ $rc = RecentChange::notifyEdit( $now, $this->mTitle, $isminor, $user, $summary,
+ $oldid, $this->getTimestamp(), $bot, '', $oldsize, $newsize,
+ $revisionId, $patrolled
+ );
+
+ // Log auto-patrolled edits
+ if ( $patrolled ) {
+ PatrolLog::record( $rc, true, $user );
+ }
+ }
+ $user->incEditCount();
+ } catch ( MWException $e ) {
+ $dbw->rollback( __METHOD__ );
+ // Question: Would it perhaps be better if this method turned all
+ // exceptions into $status's?
+ throw $e;
+ }
+ $dbw->commit( __METHOD__ );
+ } else {
+ // Bug 32948: revision ID must be set to page {{REVISIONID}} and
+ // related variables correctly
+ $revision->setId( $this->getLatest() );
+ }
+
+ // Update links tables, site stats, etc.
+ $this->doEditUpdates(
+ $revision,
+ $user,
+ array(
+ 'changed' => $changed,
+ 'oldcountable' => $oldcountable
+ )
+ );
+
+ if ( !$changed ) {
+ $status->warning( 'edit-no-change' );
+ $revision = null;
+ // Update page_touched, this is usually implicit in the page update
+ // Other cache updates are done in onArticleEdit()
+ $this->mTitle->invalidateCache();
+ }
+ } else {
+ // Create new article
+ $status->value['new'] = true;
+
+ $dbw->begin( __METHOD__ );
+ try {
+
+ $prepStatus = $content->prepareSave( $this, $flags, $baseRevId, $user );
+ $status->merge( $prepStatus );
+
+ if ( !$status->isOK() ) {
+ $dbw->rollback( __METHOD__ );
+
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ $status->merge( $prepStatus );
+
+ // Add the page record; stake our claim on this title!
+ // This will return false if the article already exists
+ $newid = $this->insertOn( $dbw );
+
+ if ( $newid === false ) {
+ $dbw->rollback( __METHOD__ );
+ $status->fatal( 'edit-already-exists' );
+
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ // Save the revision text...
+ $revision = new Revision( array(
+ 'page' => $newid,
+ 'title' => $this->getTitle(), // for determining the default content model
+ 'comment' => $summary,
+ 'minor_edit' => $isminor,
+ 'text' => $serialized,
+ 'len' => $newsize,
+ 'user' => $user->getId(),
+ 'user_text' => $user->getName(),
+ 'timestamp' => $now,
+ 'content_model' => $content->getModel(),
+ 'content_format' => $serialisation_format,
+ ) );
+ $revisionId = $revision->insertOn( $dbw );
+
+ // Bug 37225: use accessor to get the text as Revision may trim it
+ $content = $revision->getContent(); // sanity; get normalized version
+
+ if ( $content ) {
+ $newsize = $content->getSize();
+ }
+
+ // Update the page record with revision data
+ $this->updateRevisionOn( $dbw, $revision, 0 );
+
+ wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
+
+ // Update recentchanges
+ if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
+ // Mark as patrolled if the user can do so
+ $patrolled = ( $wgUseRCPatrol || $wgUseNPPatrol ) && !count(
+ $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
+ // Add RC row to the DB
+ $rc = RecentChange::notifyNew( $now, $this->mTitle, $isminor, $user, $summary, $bot,
+ '', $newsize, $revisionId, $patrolled );
+
+ // Log auto-patrolled edits
+ if ( $patrolled ) {
+ PatrolLog::record( $rc, true, $user );
+ }
+ }
+ $user->incEditCount();
+
+ } catch ( MWException $e ) {
+ $dbw->rollback( __METHOD__ );
+ throw $e;
+ }
+ $dbw->commit( __METHOD__ );
+
+ // Update links, etc.
+ $this->doEditUpdates( $revision, $user, array( 'created' => true ) );
+
+ $hook_args = array( &$this, &$user, $content, $summary,
+ $flags & EDIT_MINOR, null, null, &$flags, $revision );
+
+ ContentHandler::runLegacyHooks( 'ArticleInsertComplete', $hook_args );
+ wfRunHooks( 'PageContentInsertComplete', $hook_args );
+ }
+
+ // Do updates right now unless deferral was requested
+ if ( !( $flags & EDIT_DEFER_UPDATES ) ) {
+ DeferredUpdates::doUpdates();
+ }
+
+ // Return the new revision (or null) to the caller
+ $status->value['revision'] = $revision;
+
+ $hook_args = array( &$this, &$user, $content, $summary,
+ $flags & EDIT_MINOR, null, null, &$flags, $revision, &$status, $baseRevId );
+
+ ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $hook_args );
+ wfRunHooks( 'PageContentSaveComplete', $hook_args );
+
+ // Promote user to any groups they meet the criteria for
+ $user->addAutopromoteOnceGroups( 'onEdit' );
+
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ /**
+ * Get parser options suitable for rendering the primary article wikitext
+ *
+ * @see ContentHandler::makeParserOptions
+ *
+ * @param IContextSource|User|string $context One of the following:
+ * - IContextSource: Use the User and the Language of the provided
+ * context
+ * - User: Use the provided User object and $wgLang for the language,
+ * so use an IContextSource object if possible.
+ * - 'canonical': Canonical options (anonymous user with default
+ * preferences and content language).
+ * @return ParserOptions
+ */
+ public function makeParserOptions( $context ) {
+ $options = $this->getContentHandler()->makeParserOptions( $context );
+
+ if ( $this->getTitle()->isConversionTable() ) {
+ // @todo ConversionTable should become a separate content model, so
+ // we don't need special cases like this one.
+ $options->disableContentConversion();
+ }
+
+ return $options;
+ }
+
+ /**
+ * Prepare text which is about to be saved.
+ * Returns a stdclass with source, pst and output members
+ *
+ * @deprecated since 1.21: use prepareContentForEdit instead.
+ * @return object
+ */
+ public function prepareTextForEdit( $text, $revid = null, User $user = null ) {
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+ $content = ContentHandler::makeContent( $text, $this->getTitle() );
+ return $this->prepareContentForEdit( $content, $revid, $user );
+ }
+
+ /**
+ * Prepare content which is about to be saved.
+ * Returns a stdclass with source, pst and output members
+ *
+ * @param Content $content
+ * @param int|null $revid
+ * @param User|null $user
+ * @param string|null $serialization_format
+ *
+ * @return bool|object
+ *
+ * @since 1.21
+ */
+ public function prepareContentForEdit( Content $content, $revid = null, User $user = null,
+ $serialization_format = null
+ ) {
+ global $wgContLang, $wgUser;
+ $user = is_null( $user ) ? $wgUser : $user;
+ //XXX: check $user->getId() here???
+
+ // Use a sane default for $serialization_format, see bug 57026
+ if ( $serialization_format === null ) {
+ $serialization_format = $content->getContentHandler()->getDefaultFormat();
+ }
+
+ if ( $this->mPreparedEdit
+ && $this->mPreparedEdit->newContent
+ && $this->mPreparedEdit->newContent->equals( $content )
+ && $this->mPreparedEdit->revid == $revid
+ && $this->mPreparedEdit->format == $serialization_format
+ // XXX: also check $user here?
+ ) {
+ // Already prepared
+ return $this->mPreparedEdit;
+ }
+
+ $popts = ParserOptions::newFromUserAndLang( $user, $wgContLang );
+ wfRunHooks( 'ArticlePrepareTextForEdit', array( $this, $popts ) );
+
+ $edit = (object)array();
+ $edit->revid = $revid;
+ $edit->timestamp = wfTimestampNow();
+
+ $edit->pstContent = $content ? $content->preSaveTransform( $this->mTitle, $user, $popts ) : null;
+
+ $edit->format = $serialization_format;
+ $edit->popts = $this->makeParserOptions( 'canonical' );
+ $edit->output = $edit->pstContent
+ ? $edit->pstContent->getParserOutput( $this->mTitle, $revid, $edit->popts )
+ : null;
+
+ $edit->newContent = $content;
+ $edit->oldContent = $this->getContent( Revision::RAW );
+
+ // NOTE: B/C for hooks! don't use these fields!
+ $edit->newText = $edit->newContent ? ContentHandler::getContentText( $edit->newContent ) : '';
+ $edit->oldText = $edit->oldContent ? ContentHandler::getContentText( $edit->oldContent ) : '';
+ $edit->pst = $edit->pstContent ? $edit->pstContent->serialize( $serialization_format ) : '';
+
+ $this->mPreparedEdit = $edit;
+ return $edit;
+ }
+
+ /**
+ * Do standard deferred updates after page edit.
+ * Update links tables, site stats, search index and message cache.
+ * Purges pages that include this page if the text was changed here.
+ * Every 100th edit, prune the recent changes table.
+ *
+ * @param Revision $revision
+ * @param User $user User object that did the revision
+ * @param array $options Array of options, following indexes are used:
+ * - changed: boolean, whether the revision changed the content (default true)
+ * - created: boolean, whether the revision created the page (default false)
+ * - oldcountable: boolean or null (default null):
+ * - boolean: whether the page was counted as an article before that
+ * revision, only used in changed is true and created is false
+ * - null: don't change the article count
+ */
+ public function doEditUpdates( Revision $revision, User $user, array $options = array() ) {
+ global $wgEnableParserCache;
+
+ wfProfileIn( __METHOD__ );
+
+ $options += array( 'changed' => true, 'created' => false, 'oldcountable' => null );
+ $content = $revision->getContent();
+
+ // Parse the text
+ // Be careful not to do pre-save transform twice: $text is usually
+ // already pre-save transformed once.
+ if ( !$this->mPreparedEdit || $this->mPreparedEdit->output->getFlag( 'vary-revision' ) ) {
+ wfDebug( __METHOD__ . ": No prepared edit or vary-revision is set...\n" );
+ $editInfo = $this->prepareContentForEdit( $content, $revision->getId(), $user );
+ } else {
+ wfDebug( __METHOD__ . ": No vary-revision, using prepared edit...\n" );
+ $editInfo = $this->mPreparedEdit;
+ }
+
+ // Save it to the parser cache
+ if ( $wgEnableParserCache ) {
+ $parserCache = ParserCache::singleton();
+ $parserCache->save(
+ $editInfo->output, $this, $editInfo->popts, $editInfo->timestamp, $editInfo->revid
+ );
+ }
+
+ // Update the links tables and other secondary data
+ if ( $content ) {
+ $recursive = $options['changed']; // bug 50785
+ $updates = $content->getSecondaryDataUpdates(
+ $this->getTitle(), null, $recursive, $editInfo->output );
+ DataUpdate::runUpdates( $updates );
+ }
+
+ wfRunHooks( 'ArticleEditUpdates', array( &$this, &$editInfo, $options['changed'] ) );
+
+ if ( wfRunHooks( 'ArticleEditUpdatesDeleteFromRecentchanges', array( &$this ) ) ) {
+ if ( 0 == mt_rand( 0, 99 ) ) {
+ // Flush old entries from the `recentchanges` table; we do this on
+ // random requests so as to avoid an increase in writes for no good reason
+ RecentChange::purgeExpiredChanges();
+ }
+ }
+
+ if ( !$this->exists() ) {
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+
+ $id = $this->getId();
+ $title = $this->mTitle->getPrefixedDBkey();
+ $shortTitle = $this->mTitle->getDBkey();
+
+ if ( !$options['changed'] ) {
+ $good = 0;
+ } elseif ( $options['created'] ) {
+ $good = (int)$this->isCountable( $editInfo );
+ } elseif ( $options['oldcountable'] !== null ) {
+ $good = (int)$this->isCountable( $editInfo ) - (int)$options['oldcountable'];
+ } else {
+ $good = 0;
+ }
+ $edits = $options['changed'] ? 1 : 0;
+ $total = $options['created'] ? 1 : 0;
+
+ DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, $edits, $good, $total ) );
+ DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $content ) );
+
+ // If this is another user's talk page, update newtalk.
+ // Don't do this if $options['changed'] = false (null-edits) nor if
+ // it's a minor edit and the user doesn't want notifications for those.
+ if ( $options['changed']
+ && $this->mTitle->getNamespace() == NS_USER_TALK
+ && $shortTitle != $user->getTitleKey()
+ && !( $revision->isMinor() && $user->isAllowed( 'nominornewtalk' ) )
+ ) {
+ $recipient = User::newFromName( $shortTitle, false );
+ if ( !$recipient ) {
+ wfDebug( __METHOD__ . ": invalid username\n" );
+ } else {
+ // Allow extensions to prevent user notification when a new message is added to their talk page
+ if ( wfRunHooks( 'ArticleEditUpdateNewTalk', array( &$this, $recipient ) ) ) {
+ if ( User::isIP( $shortTitle ) ) {
+ // An anonymous user
+ $recipient->setNewtalk( true, $revision );
+ } elseif ( $recipient->isLoggedIn() ) {
+ $recipient->setNewtalk( true, $revision );
+ } else {
+ wfDebug( __METHOD__ . ": don't need to notify a nonexistent user\n" );
+ }
+ }
+ }
+ }
+
+ if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
+ // XXX: could skip pseudo-messages like js/css here, based on content model.
+ $msgtext = $content ? $content->getWikitextForTransclusion() : null;
+ if ( $msgtext === false || $msgtext === null ) {
+ $msgtext = '';
+ }
+
+ MessageCache::singleton()->replace( $shortTitle, $msgtext );
+ }
+
+ if ( $options['created'] ) {
+ self::onArticleCreate( $this->mTitle );
+ } elseif ( $options['changed'] ) { // bug 50785
+ self::onArticleEdit( $this->mTitle );
+ }
+
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Edit an article without doing all that other stuff
+ * The article must already exist; link tables etc
+ * are not updated, caches are not flushed.
+ *
+ * @param string $text Text submitted
+ * @param User $user The relevant user
+ * @param string $comment Comment submitted
+ * @param bool $minor Whereas it's a minor modification
+ *
+ * @deprecated since 1.21, use doEditContent() instead.
+ */
+ public function doQuickEdit( $text, User $user, $comment = '', $minor = 0 ) {
+ ContentHandler::deprecated( __METHOD__, "1.21" );
+
+ $content = ContentHandler::makeContent( $text, $this->getTitle() );
+ $this->doQuickEditContent( $content, $user, $comment, $minor );
+ }
+
+ /**
+ * Edit an article without doing all that other stuff
+ * The article must already exist; link tables etc
+ * are not updated, caches are not flushed.
+ *
+ * @param Content $content Content submitted
+ * @param User $user The relevant user
+ * @param string $comment comment submitted
+ * @param string $serialisation_format Format for storing the content in the database
+ * @param bool $minor Whereas it's a minor modification
+ */
+ public function doQuickEditContent( Content $content, User $user, $comment = '', $minor = false,
+ $serialisation_format = null
+ ) {
+ wfProfileIn( __METHOD__ );
+
+ $serialized = $content->serialize( $serialisation_format );
+
+ $dbw = wfGetDB( DB_MASTER );
+ $revision = new Revision( array(
+ 'title' => $this->getTitle(), // for determining the default content model
+ 'page' => $this->getId(),
+ 'user_text' => $user->getName(),
+ 'user' => $user->getId(),
+ 'text' => $serialized,
+ 'length' => $content->getSize(),
+ 'comment' => $comment,
+ 'minor_edit' => $minor ? 1 : 0,
+ ) ); // XXX: set the content object?
+ $revision->insertOn( $dbw );
+ $this->updateRevisionOn( $dbw, $revision );
+
+ wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
+
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Update the article's restriction field, and leave a log entry.
+ * This works for protection both existing and non-existing pages.
+ *
+ * @param array $limit Set of restriction keys
+ * @param array $expiry Per restriction type expiration
+ * @param int &$cascade Set to false if cascading protection isn't allowed.
+ * @param string $reason
+ * @param User $user The user updating the restrictions
+ * @return Status
+ */
+ public function doUpdateRestrictions( array $limit, array $expiry,
+ &$cascade, $reason, User $user
+ ) {
+ global $wgCascadingRestrictionLevels, $wgContLang;
+
+ if ( wfReadOnly() ) {
+ return Status::newFatal( 'readonlytext', wfReadOnlyReason() );
+ }
+
+ $this->loadPageData( 'fromdbmaster' );
+ $restrictionTypes = $this->mTitle->getRestrictionTypes();
+ $id = $this->getId();
+
+ if ( !$cascade ) {
+ $cascade = false;
+ }
+
+ // Take this opportunity to purge out expired restrictions
+ Title::purgeExpiredRestrictions();
+
+ // @todo FIXME: Same limitations as described in ProtectionForm.php (line 37);
+ // we expect a single selection, but the schema allows otherwise.
+ $isProtected = false;
+ $protect = false;
+ $changed = false;
+
+ $dbw = wfGetDB( DB_MASTER );
+
+ foreach ( $restrictionTypes as $action ) {
+ if ( !isset( $expiry[$action] ) ) {
+ $expiry[$action] = $dbw->getInfinity();
+ }
+ if ( !isset( $limit[$action] ) ) {
+ $limit[$action] = '';
+ } elseif ( $limit[$action] != '' ) {
+ $protect = true;
+ }
+
+ // Get current restrictions on $action
+ $current = implode( '', $this->mTitle->getRestrictions( $action ) );
+ if ( $current != '' ) {
+ $isProtected = true;
+ }
+
+ if ( $limit[$action] != $current ) {
+ $changed = true;
+ } elseif ( $limit[$action] != '' ) {
+ // Only check expiry change if the action is actually being
+ // protected, since expiry does nothing on an not-protected
+ // action.
+ if ( $this->mTitle->getRestrictionExpiry( $action ) != $expiry[$action] ) {
+ $changed = true;
+ }
+ }
+ }
+
+ if ( !$changed && $protect && $this->mTitle->areRestrictionsCascading() != $cascade ) {
+ $changed = true;
+ }
+
+ // If nothing has changed, do nothing
+ if ( !$changed ) {
+ return Status::newGood();
+ }
+
+ if ( !$protect ) { // No protection at all means unprotection
+ $revCommentMsg = 'unprotectedarticle';
+ $logAction = 'unprotect';
+ } elseif ( $isProtected ) {
+ $revCommentMsg = 'modifiedarticleprotection';
+ $logAction = 'modify';
+ } else {
+ $revCommentMsg = 'protectedarticle';
+ $logAction = 'protect';
+ }
+
+ // Truncate for whole multibyte characters
+ $reason = $wgContLang->truncate( $reason, 255 );
+
+ $logRelationsValues = array();
+ $logRelationsField = null;
+
+ if ( $id ) { // Protection of existing page
+ if ( !wfRunHooks( 'ArticleProtect', array( &$this, &$user, $limit, $reason ) ) ) {
+ return Status::newGood();
+ }
+
+ // Only certain restrictions can cascade...
+ $editrestriction = isset( $limit['edit'] )
+ ? array( $limit['edit'] )
+ : $this->mTitle->getRestrictions( 'edit' );
+ foreach ( array_keys( $editrestriction, 'sysop' ) as $key ) {
+ $editrestriction[$key] = 'editprotected'; // backwards compatibility
+ }
+ foreach ( array_keys( $editrestriction, 'autoconfirmed' ) as $key ) {
+ $editrestriction[$key] = 'editsemiprotected'; // backwards compatibility
+ }
+
+ $cascadingRestrictionLevels = $wgCascadingRestrictionLevels;
+ foreach ( array_keys( $cascadingRestrictionLevels, 'sysop' ) as $key ) {
+ $cascadingRestrictionLevels[$key] = 'editprotected'; // backwards compatibility
+ }
+ foreach ( array_keys( $cascadingRestrictionLevels, 'autoconfirmed' ) as $key ) {
+ $cascadingRestrictionLevels[$key] = 'editsemiprotected'; // backwards compatibility
+ }
+
+ // The schema allows multiple restrictions
+ if ( !array_intersect( $editrestriction, $cascadingRestrictionLevels ) ) {
+ $cascade = false;
+ }
+
+ // insert null revision to identify the page protection change as edit summary
+ $latest = $this->getLatest();
+ $nullRevision = $this->insertProtectNullRevision(
+ $revCommentMsg,
+ $limit,
+ $expiry,
+ $cascade,
+ $reason,
+ $user
+ );
+
+ if ( $nullRevision === null ) {
+ return Status::newFatal( 'no-null-revision', $this->mTitle->getPrefixedText() );
+ }
+
+ $logRelationsField = 'pr_id';
+
+ // Update restrictions table
+ foreach ( $limit as $action => $restrictions ) {
+ $dbw->delete(
+ 'page_restrictions',
+ array(
+ 'pr_page' => $id,
+ 'pr_type' => $action
+ ),
+ __METHOD__
+ );
+ if ( $restrictions != '' ) {
+ $dbw->insert(
+ 'page_restrictions',
+ array(
+ 'pr_id' => $dbw->nextSequenceValue( 'page_restrictions_pr_id_seq' ),
+ 'pr_page' => $id,
+ 'pr_type' => $action,
+ 'pr_level' => $restrictions,
+ 'pr_cascade' => ( $cascade && $action == 'edit' ) ? 1 : 0,
+ 'pr_expiry' => $dbw->encodeExpiry( $expiry[$action] )
+ ),
+ __METHOD__
+ );
+ $logRelationsValues[] = $dbw->insertId();
+ }
+ }
+
+ // Clear out legacy restriction fields
+ $dbw->update(
+ 'page',
+ array( 'page_restrictions' => '' ),
+ array( 'page_id' => $id ),
+ __METHOD__
+ );
+
+ wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $nullRevision, $latest, $user ) );
+ wfRunHooks( 'ArticleProtectComplete', array( &$this, &$user, $limit, $reason ) );
+ } else { // Protection of non-existing page (also known as "title protection")
+ // Cascade protection is meaningless in this case
+ $cascade = false;
+
+ if ( $limit['create'] != '' ) {
+ $dbw->replace( 'protected_titles',
+ array( array( 'pt_namespace', 'pt_title' ) ),
+ array(
+ 'pt_namespace' => $this->mTitle->getNamespace(),
+ 'pt_title' => $this->mTitle->getDBkey(),
+ 'pt_create_perm' => $limit['create'],
+ 'pt_timestamp' => $dbw->timestamp(),
+ 'pt_expiry' => $dbw->encodeExpiry( $expiry['create'] ),
+ 'pt_user' => $user->getId(),
+ 'pt_reason' => $reason,
+ ), __METHOD__
+ );
+ } else {
+ $dbw->delete( 'protected_titles',
+ array(
+ 'pt_namespace' => $this->mTitle->getNamespace(),
+ 'pt_title' => $this->mTitle->getDBkey()
+ ), __METHOD__
+ );
+ }
+ }
+
+ $this->mTitle->flushRestrictions();
+ InfoAction::invalidateCache( $this->mTitle );
+
+ if ( $logAction == 'unprotect' ) {
+ $params = array();
+ } else {
+ $protectDescriptionLog = $this->protectDescriptionLog( $limit, $expiry );
+ $params = array( $protectDescriptionLog, $cascade ? 'cascade' : '' );
+ }
+
+ // Update the protection log
+ $log = new LogPage( 'protect' );
+ $logId = $log->addEntry( $logAction, $this->mTitle, $reason, $params, $user );
+ if ( $logRelationsField !== null && count( $logRelationsValues ) ) {
+ $log->addRelations( $logRelationsField, $logRelationsValues, $logId );
+ }
+
+ return Status::newGood();
+ }
+
+ /**
+ * Insert a new null revision for this page.
+ *
+ * @param string $revCommentMsg Comment message key for the revision
+ * @param array $limit Set of restriction keys
+ * @param array $expiry Per restriction type expiration
+ * @param int $cascade Set to false if cascading protection isn't allowed.
+ * @param string $reason
+ * @param User|null $user
+ * @return Revision|null Null on error
+ */
+ public function insertProtectNullRevision( $revCommentMsg, array $limit,
+ array $expiry, $cascade, $reason, $user = null
+ ) {
+ global $wgContLang;
+ $dbw = wfGetDB( DB_MASTER );
+
+ // Prepare a null revision to be added to the history
+ $editComment = $wgContLang->ucfirst(
+ wfMessage(
+ $revCommentMsg,
+ $this->mTitle->getPrefixedText()
+ )->inContentLanguage()->text()
+ );
+ if ( $reason ) {
+ $editComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
+ }
+ $protectDescription = $this->protectDescription( $limit, $expiry );
+ if ( $protectDescription ) {
+ $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
+ $editComment .= wfMessage( 'parentheses' )->params( $protectDescription )
+ ->inContentLanguage()->text();
+ }
+ if ( $cascade ) {
+ $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
+ $editComment .= wfMessage( 'brackets' )->params(
+ wfMessage( 'protect-summary-cascade' )->inContentLanguage()->text()
+ )->inContentLanguage()->text();
+ }
+
+ $nullRev = Revision::newNullRevision( $dbw, $this->getId(), $editComment, true, $user );
+ if ( $nullRev ) {
+ $nullRev->insertOn( $dbw );
+
+ // Update page record and touch page
+ $oldLatest = $nullRev->getParentId();
+ $this->updateRevisionOn( $dbw, $nullRev, $oldLatest );
+ }
+
+ return $nullRev;
+ }
+
+ /**
+ * @param string $expiry 14-char timestamp or "infinity", or false if the input was invalid
+ * @return string
+ */
+ protected function formatExpiry( $expiry ) {
+ global $wgContLang;
+ $dbr = wfGetDB( DB_SLAVE );
+
+ $encodedExpiry = $dbr->encodeExpiry( $expiry );
+ if ( $encodedExpiry != 'infinity' ) {
+ return wfMessage(
+ 'protect-expiring',
+ $wgContLang->timeanddate( $expiry, false, false ),
+ $wgContLang->date( $expiry, false, false ),
+ $wgContLang->time( $expiry, false, false )
+ )->inContentLanguage()->text();
+ } else {
+ return wfMessage( 'protect-expiry-indefinite' )
+ ->inContentLanguage()->text();
+ }
+ }
+
+ /**
+ * Builds the description to serve as comment for the edit.
+ *
+ * @param array $limit Set of restriction keys
+ * @param array $expiry Per restriction type expiration
+ * @return string
+ */
+ public function protectDescription( array $limit, array $expiry ) {
+ $protectDescription = '';
+
+ foreach ( array_filter( $limit ) as $action => $restrictions ) {
+ # $action is one of $wgRestrictionTypes = array( 'create', 'edit', 'move', 'upload' ).
+ # All possible message keys are listed here for easier grepping:
+ # * restriction-create
+ # * restriction-edit
+ # * restriction-move
+ # * restriction-upload
+ $actionText = wfMessage( 'restriction-' . $action )->inContentLanguage()->text();
+ # $restrictions is one of $wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' ),
+ # with '' filtered out. All possible message keys are listed below:
+ # * protect-level-autoconfirmed
+ # * protect-level-sysop
+ $restrictionsText = wfMessage( 'protect-level-' . $restrictions )->inContentLanguage()->text();
+
+ $expiryText = $this->formatExpiry( $expiry[$action] );
+
+ if ( $protectDescription !== '' ) {
+ $protectDescription .= wfMessage( 'word-separator' )->inContentLanguage()->text();
+ }
+ $protectDescription .= wfMessage( 'protect-summary-desc' )
+ ->params( $actionText, $restrictionsText, $expiryText )
+ ->inContentLanguage()->text();
+ }
+
+ return $protectDescription;
+ }
+
+ /**
+ * Builds the description to serve as comment for the log entry.
+ *
+ * Some bots may parse IRC lines, which are generated from log entries which contain plain
+ * protect description text. Keep them in old format to avoid breaking compatibility.
+ * TODO: Fix protection log to store structured description and format it on-the-fly.
+ *
+ * @param array $limit Set of restriction keys
+ * @param array $expiry Per restriction type expiration
+ * @return string
+ */
+ public function protectDescriptionLog( array $limit, array $expiry ) {
+ global $wgContLang;
+
+ $protectDescriptionLog = '';
+
+ foreach ( array_filter( $limit ) as $action => $restrictions ) {
+ $expiryText = $this->formatExpiry( $expiry[$action] );
+ $protectDescriptionLog .= $wgContLang->getDirMark() . "[$action=$restrictions] ($expiryText)";
+ }
+
+ return trim( $protectDescriptionLog );
+ }
+
+ /**
+ * Take an array of page restrictions and flatten it to a string
+ * suitable for insertion into the page_restrictions field.
+ *
+ * @param string[] $limit
+ *
+ * @throws MWException
+ * @return string
+ */
+ protected static function flattenRestrictions( $limit ) {
+ if ( !is_array( $limit ) ) {
+ throw new MWException( 'WikiPage::flattenRestrictions given non-array restriction set' );
+ }
+
+ $bits = array();
+ ksort( $limit );
+
+ foreach ( array_filter( $limit ) as $action => $restrictions ) {
+ $bits[] = "$action=$restrictions";
+ }
+
+ return implode( ':', $bits );
+ }
+
+ /**
+ * Same as doDeleteArticleReal(), but returns a simple boolean. This is kept around for
+ * backwards compatibility, if you care about error reporting you should use
+ * doDeleteArticleReal() instead.
+ *
+ * Deletes the article with database consistency, writes logs, purges caches
+ *
+ * @param string $reason Delete reason for deletion log
+ * @param bool $suppress Suppress all revisions and log the deletion in
+ * the suppression log instead of the deletion log
+ * @param int $id Article ID
+ * @param bool $commit Defaults to true, triggers transaction end
+ * @param array &$error Array of errors to append to
+ * @param User $user The deleting user
+ * @return bool true if successful
+ */
+ public function doDeleteArticle(
+ $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
+ ) {
+ $status = $this->doDeleteArticleReal( $reason, $suppress, $id, $commit, $error, $user );
+ return $status->isGood();
+ }
+
+ /**
+ * Back-end article deletion
+ * Deletes the article with database consistency, writes logs, purges caches
+ *
+ * @since 1.19
+ *
+ * @param string $reason Delete reason for deletion log
+ * @param bool $suppress Suppress all revisions and log the deletion in
+ * the suppression log instead of the deletion log
+ * @param int $id Article ID
+ * @param bool $commit Defaults to true, triggers transaction end
+ * @param array &$error Array of errors to append to
+ * @param User $user The deleting user
+ * @return Status Status object; if successful, $status->value is the log_id of the
+ * deletion log entry. If the page couldn't be deleted because it wasn't
+ * found, $status is a non-fatal 'cannotdelete' error
+ */
+ public function doDeleteArticleReal(
+ $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
+ ) {
+ global $wgUser, $wgContentHandlerUseDB;
+
+ wfDebug( __METHOD__ . "\n" );
+
+ $status = Status::newGood();
+
+ if ( $this->mTitle->getDBkey() === '' ) {
+ $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
+ return $status;
+ }
+
+ $user = is_null( $user ) ? $wgUser : $user;
+ if ( ! wfRunHooks( 'ArticleDelete', array( &$this, &$user, &$reason, &$error, &$status ) ) ) {
+ if ( $status->isOK() ) {
+ // Hook aborted but didn't set a fatal status
+ $status->fatal( 'delete-hook-aborted' );
+ }
+ return $status;
+ }
+
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->begin( __METHOD__ );
+
+ if ( $id == 0 ) {
+ $this->loadPageData( 'forupdate' );
+ $id = $this->getID();
+ if ( $id == 0 ) {
+ $dbw->rollback( __METHOD__ );
+ $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
+ return $status;
+ }
+ }
+
+ // we need to remember the old content so we can use it to generate all deletion updates.
+ $content = $this->getContent( Revision::RAW );
+
+ // Bitfields to further suppress the content
+ if ( $suppress ) {
+ $bitfield = 0;
+ // This should be 15...
+ $bitfield |= Revision::DELETED_TEXT;
+ $bitfield |= Revision::DELETED_COMMENT;
+ $bitfield |= Revision::DELETED_USER;
+ $bitfield |= Revision::DELETED_RESTRICTED;
+ } else {
+ $bitfield = 'rev_deleted';
+ }
+
+ // For now, shunt the revision data into the archive table.
+ // Text is *not* removed from the text table; bulk storage
+ // is left intact to avoid breaking block-compression or
+ // immutable storage schemes.
+ //
+ // For backwards compatibility, note that some older archive
+ // table entries will have ar_text and ar_flags fields still.
+ //
+ // In the future, we may keep revisions and mark them with
+ // the rev_deleted field, which is reserved for this purpose.
+
+ $row = array(
+ 'ar_namespace' => 'page_namespace',
+ 'ar_title' => 'page_title',
+ 'ar_comment' => 'rev_comment',
+ 'ar_user' => 'rev_user',
+ 'ar_user_text' => 'rev_user_text',
+ 'ar_timestamp' => 'rev_timestamp',
+ 'ar_minor_edit' => 'rev_minor_edit',
+ 'ar_rev_id' => 'rev_id',
+ 'ar_parent_id' => 'rev_parent_id',
+ 'ar_text_id' => 'rev_text_id',
+ 'ar_text' => '\'\'', // Be explicit to appease
+ 'ar_flags' => '\'\'', // MySQL's "strict mode"...
+ 'ar_len' => 'rev_len',
+ 'ar_page_id' => 'page_id',
+ 'ar_deleted' => $bitfield,
+ 'ar_sha1' => 'rev_sha1',
+ );
+
+ if ( $wgContentHandlerUseDB ) {
+ $row['ar_content_model'] = 'rev_content_model';
+ $row['ar_content_format'] = 'rev_content_format';
+ }
+
+ $dbw->insertSelect( 'archive', array( 'page', 'revision' ),
+ $row,
+ array(
+ 'page_id' => $id,
+ 'page_id = rev_page'
+ ), __METHOD__
+ );
+
+ // Now that it's safely backed up, delete it
+ $dbw->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
+ $ok = ( $dbw->affectedRows() > 0 ); // $id could be laggy
+
+ if ( !$ok ) {
+ $dbw->rollback( __METHOD__ );
+ $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
+ return $status;
+ }
+
+ if ( !$dbw->cascadingDeletes() ) {
+ $dbw->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
+ }
+
+ // Clone the title, so we have the information we need when we log
+ $logTitle = clone $this->mTitle;
+
+ $this->doDeleteUpdates( $id, $content );
+
+ // Log the deletion, if the page was suppressed, log it at Oversight instead
+ $logtype = $suppress ? 'suppress' : 'delete';
+
+ $logEntry = new ManualLogEntry( $logtype, 'delete' );
+ $logEntry->setPerformer( $user );
+ $logEntry->setTarget( $logTitle );
+ $logEntry->setComment( $reason );
+ $logid = $logEntry->insert();
+
+ $dbw->onTransactionPreCommitOrIdle( function() use ( $dbw, $logEntry, $logid ) {
+ // Bug 56776: avoid deadlocks (especially from FileDeleteForm)
+ $logEntry->publish( $logid );
+ } );
+
+ if ( $commit ) {
+ $dbw->commit( __METHOD__ );
+ }
+
+ wfRunHooks( 'ArticleDeleteComplete', array( &$this, &$user, $reason, $id, $content, $logEntry ) );
+ $status->value = $logid;
+ return $status;
+ }
+
+ /**
+ * Do some database updates after deletion
+ *
+ * @param int $id page_id value of the page being deleted
+ * @param Content $content Optional page content to be used when determining
+ * the required updates. This may be needed because $this->getContent()
+ * may already return null when the page proper was deleted.
+ */
+ public function doDeleteUpdates( $id, Content $content = null ) {
+ // update site status
+ DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, - (int)$this->isCountable(), -1 ) );
+
+ // remove secondary indexes, etc
+ $updates = $this->getDeletionUpdates( $content );
+ DataUpdate::runUpdates( $updates );
+
+ // Reparse any pages transcluding this page
+ LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'templatelinks' );
+
+ // Reparse any pages including this image
+ if ( $this->mTitle->getNamespace() == NS_FILE ) {
+ LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'imagelinks' );
+ }
+
+ // Clear caches
+ WikiPage::onArticleDelete( $this->mTitle );
+
+ // Reset this object and the Title object
+ $this->loadFromRow( false, self::READ_LATEST );
+
+ // Search engine
+ DeferredUpdates::addUpdate( new SearchUpdate( $id, $this->mTitle ) );
+ }
+
+ /**
+ * Roll back the most recent consecutive set of edits to a page
+ * from the same user; fails if there are no eligible edits to
+ * roll back to, e.g. user is the sole contributor. This function
+ * performs permissions checks on $user, then calls commitRollback()
+ * to do the dirty work
+ *
+ * @todo Separate the business/permission stuff out from backend code
+ *
+ * @param string $fromP Name of the user whose edits to rollback.
+ * @param string $summary Custom summary. Set to default summary if empty.
+ * @param string $token Rollback token.
+ * @param bool $bot If true, mark all reverted edits as bot.
+ *
+ * @param array $resultDetails contains result-specific array of additional values
+ * 'alreadyrolled' : 'current' (rev)
+ * success : 'summary' (str), 'current' (rev), 'target' (rev)
+ *
+ * @param User $user The user performing the rollback
+ * @return array Array of errors, each error formatted as
+ * array(messagekey, param1, param2, ...).
+ * On success, the array is empty. This array can also be passed to
+ * OutputPage::showPermissionsErrorPage().
+ */
+ public function doRollback(
+ $fromP, $summary, $token, $bot, &$resultDetails, User $user
+ ) {
+ $resultDetails = null;
+
+ // Check permissions
+ $editErrors = $this->mTitle->getUserPermissionsErrors( 'edit', $user );
+ $rollbackErrors = $this->mTitle->getUserPermissionsErrors( 'rollback', $user );
+ $errors = array_merge( $editErrors, wfArrayDiff2( $rollbackErrors, $editErrors ) );
+
+ if ( !$user->matchEditToken( $token, array( $this->mTitle->getPrefixedText(), $fromP ) ) ) {
+ $errors[] = array( 'sessionfailure' );
+ }
+
+ if ( $user->pingLimiter( 'rollback' ) || $user->pingLimiter() ) {
+ $errors[] = array( 'actionthrottledtext' );
+ }
+
+ // If there were errors, bail out now
+ if ( !empty( $errors ) ) {
+ return $errors;
+ }
+
+ return $this->commitRollback( $fromP, $summary, $bot, $resultDetails, $user );
+ }
+
+ /**
+ * Backend implementation of doRollback(), please refer there for parameter
+ * and return value documentation
+ *
+ * NOTE: This function does NOT check ANY permissions, it just commits the
+ * rollback to the DB. Therefore, you should only call this function direct-
+ * ly if you want to use custom permissions checks. If you don't, use
+ * doRollback() instead.
+ * @param string $fromP Name of the user whose edits to rollback.
+ * @param string $summary Custom summary. Set to default summary if empty.
+ * @param bool $bot If true, mark all reverted edits as bot.
+ *
+ * @param array $resultDetails Contains result-specific array of additional values
+ * @param User $guser The user performing the rollback
+ * @return array
+ */
+ public function commitRollback( $fromP, $summary, $bot, &$resultDetails, User $guser ) {
+ global $wgUseRCPatrol, $wgContLang;
+
+ $dbw = wfGetDB( DB_MASTER );
+
+ if ( wfReadOnly() ) {
+ return array( array( 'readonlytext' ) );
+ }
+
+ // Get the last editor
+ $current = $this->getRevision();
+ if ( is_null( $current ) ) {
+ // Something wrong... no page?
+ return array( array( 'notanarticle' ) );
+ }
+
+ $from = str_replace( '_', ' ', $fromP );
+ // User name given should match up with the top revision.
+ // If the user was deleted then $from should be empty.
+ if ( $from != $current->getUserText() ) {
+ $resultDetails = array( 'current' => $current );
+ return array( array( 'alreadyrolled',
+ htmlspecialchars( $this->mTitle->getPrefixedText() ),
+ htmlspecialchars( $fromP ),
+ htmlspecialchars( $current->getUserText() )
+ ) );
+ }
+
+ // Get the last edit not by this guy...
+ // Note: these may not be public values
+ $user = intval( $current->getRawUser() );
+ $user_text = $dbw->addQuotes( $current->getRawUserText() );
+ $s = $dbw->selectRow( 'revision',
+ array( 'rev_id', 'rev_timestamp', 'rev_deleted' ),
+ array( 'rev_page' => $current->getPage(),
+ "rev_user != {$user} OR rev_user_text != {$user_text}"
+ ), __METHOD__,
+ array( 'USE INDEX' => 'page_timestamp',
+ 'ORDER BY' => 'rev_timestamp DESC' )
+ );
+ if ( $s === false ) {
+ // No one else ever edited this page
+ return array( array( 'cantrollback' ) );
+ } elseif ( $s->rev_deleted & Revision::DELETED_TEXT
+ || $s->rev_deleted & Revision::DELETED_USER
+ ) {
+ // Only admins can see this text
+ return array( array( 'notvisiblerev' ) );
+ }
+
+ // Set patrolling and bot flag on the edits, which gets rollbacked.
+ // This is done before the rollback edit to have patrolling also on failure (bug 62157).
+ $set = array();
+ if ( $bot && $guser->isAllowed( 'markbotedits' ) ) {
+ // Mark all reverted edits as bot
+ $set['rc_bot'] = 1;
+ }
+
+ if ( $wgUseRCPatrol ) {
+ // Mark all reverted edits as patrolled
+ $set['rc_patrolled'] = 1;
+ }
+
+ if ( count( $set ) ) {
+ $dbw->update( 'recentchanges', $set,
+ array( /* WHERE */
+ 'rc_cur_id' => $current->getPage(),
+ 'rc_user_text' => $current->getUserText(),
+ 'rc_timestamp > ' . $dbw->addQuotes( $s->rev_timestamp ),
+ ), __METHOD__
+ );
+ }
+
+ // Generate the edit summary if necessary
+ $target = Revision::newFromId( $s->rev_id );
+ if ( empty( $summary ) ) {
+ if ( $from == '' ) { // no public user name
+ $summary = wfMessage( 'revertpage-nouser' );
+ } else {
+ $summary = wfMessage( 'revertpage' );
+ }
+ }
+
+ // Allow the custom summary to use the same args as the default message
+ $args = array(
+ $target->getUserText(), $from, $s->rev_id,
+ $wgContLang->timeanddate( wfTimestamp( TS_MW, $s->rev_timestamp ) ),
+ $current->getId(), $wgContLang->timeanddate( $current->getTimestamp() )
+ );
+ if ( $summary instanceof Message ) {
+ $summary = $summary->params( $args )->inContentLanguage()->text();
+ } else {
+ $summary = wfMsgReplaceArgs( $summary, $args );
+ }
+
+ // Trim spaces on user supplied text
+ $summary = trim( $summary );
+
+ // Truncate for whole multibyte characters.
+ $summary = $wgContLang->truncate( $summary, 255 );
+
+ // Save
+ $flags = EDIT_UPDATE;
+
+ if ( $guser->isAllowed( 'minoredit' ) ) {
+ $flags |= EDIT_MINOR;
+ }
+
+ if ( $bot && ( $guser->isAllowedAny( 'markbotedits', 'bot' ) ) ) {
+ $flags |= EDIT_FORCE_BOT;
+ }
+
+ // Actually store the edit
+ $status = $this->doEditContent(
+ $target->getContent(),
+ $summary,
+ $flags,
+ $target->getId(),
+ $guser
+ );
+
+ if ( !$status->isOK() ) {
+ return $status->getErrorsArray();
+ }
+
+ // raise error, when the edit is an edit without a new version
+ if ( empty( $status->value['revision'] ) ) {
+ $resultDetails = array( 'current' => $current );
+ return array( array( 'alreadyrolled',
+ htmlspecialchars( $this->mTitle->getPrefixedText() ),
+ htmlspecialchars( $fromP ),
+ htmlspecialchars( $current->getUserText() )
+ ) );
+ }
+
+ $revId = $status->value['revision']->getId();
+
+ wfRunHooks( 'ArticleRollbackComplete', array( $this, $guser, $target, $current ) );
+
+ $resultDetails = array(
+ 'summary' => $summary,
+ 'current' => $current,
+ 'target' => $target,
+ 'newid' => $revId
+ );
+
+ return array();
+ }
+
+ /**
+ * The onArticle*() functions are supposed to be a kind of hooks
+ * which should be called whenever any of the specified actions
+ * are done.
+ *
+ * This is a good place to put code to clear caches, for instance.
+ *
+ * This is called on page move and undelete, as well as edit
+ *
+ * @param Title $title
+ */
+ public static function onArticleCreate( $title ) {
+ // Update existence markers on article/talk tabs...
+ if ( $title->isTalkPage() ) {
+ $other = $title->getSubjectPage();
+ } else {
+ $other = $title->getTalkPage();
+ }
+
+ $other->invalidateCache();
+ $other->purgeSquid();
+
+ $title->touchLinks();
+ $title->purgeSquid();
+ $title->deleteTitleProtection();
+ }
+
+ /**
+ * Clears caches when article is deleted
+ *
+ * @param Title $title
+ */
+ public static function onArticleDelete( $title ) {
+ // Update existence markers on article/talk tabs...
+ if ( $title->isTalkPage() ) {
+ $other = $title->getSubjectPage();
+ } else {
+ $other = $title->getTalkPage();
+ }
+
+ $other->invalidateCache();
+ $other->purgeSquid();
+
+ $title->touchLinks();
+ $title->purgeSquid();
+
+ // File cache
+ HTMLFileCache::clearFileCache( $title );
+ InfoAction::invalidateCache( $title );
+
+ // Messages
+ if ( $title->getNamespace() == NS_MEDIAWIKI ) {
+ MessageCache::singleton()->replace( $title->getDBkey(), false );
+ }
+
+ // Images
+ if ( $title->getNamespace() == NS_FILE ) {
+ $update = new HTMLCacheUpdate( $title, 'imagelinks' );
+ $update->doUpdate();
+ }
+
+ // User talk pages
+ if ( $title->getNamespace() == NS_USER_TALK ) {
+ $user = User::newFromName( $title->getText(), false );
+ if ( $user ) {
+ $user->setNewtalk( false );
+ }
+ }
+
+ // Image redirects
+ RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $title );
+ }
+
+ /**
+ * Purge caches on page update etc
+ *
+ * @param Title $title
+ * @todo Verify that $title is always a Title object (and never false or
+ * null), add Title hint to parameter $title.
+ */
+ public static function onArticleEdit( $title ) {
+ // Invalidate caches of articles which include this page
+ DeferredUpdates::addHTMLCacheUpdate( $title, 'templatelinks' );
+
+ // Invalidate the caches of all pages which redirect here
+ DeferredUpdates::addHTMLCacheUpdate( $title, 'redirect' );
+
+ // Purge squid for this page only
+ $title->purgeSquid();
+
+ // Clear file cache for this page only
+ HTMLFileCache::clearFileCache( $title );
+ InfoAction::invalidateCache( $title );
+ }
+
+ /**#@-*/
+
+ /**
+ * Returns a list of categories this page is a member of.
+ * Results will include hidden categories
+ *
+ * @return TitleArray
+ */
+ public function getCategories() {
+ $id = $this->getId();
+ if ( $id == 0 ) {
+ return TitleArray::newFromResult( new FakeResultWrapper( array() ) );
+ }
+
+ $dbr = wfGetDB( DB_SLAVE );
+ $res = $dbr->select( 'categorylinks',
+ array( 'cl_to AS page_title, ' . NS_CATEGORY . ' AS page_namespace' ),
+ // Have to do that since DatabaseBase::fieldNamesWithAlias treats numeric indexes
+ // as not being aliases, and NS_CATEGORY is numeric
+ array( 'cl_from' => $id ),
+ __METHOD__ );
+
+ return TitleArray::newFromResult( $res );
+ }
+
+ /**
+ * Returns a list of hidden categories this page is a member of.
+ * Uses the page_props and categorylinks tables.
+ *
+ * @return array Array of Title objects
+ */
+ public function getHiddenCategories() {
+ $result = array();
+ $id = $this->getId();
+
+ if ( $id == 0 ) {
+ return array();
+ }
+
+ $dbr = wfGetDB( DB_SLAVE );
+ $res = $dbr->select( array( 'categorylinks', 'page_props', 'page' ),
+ array( 'cl_to' ),
+ array( 'cl_from' => $id, 'pp_page=page_id', 'pp_propname' => 'hiddencat',
+ 'page_namespace' => NS_CATEGORY, 'page_title=cl_to' ),
+ __METHOD__ );
+
+ if ( $res !== false ) {
+ foreach ( $res as $row ) {
+ $result[] = Title::makeTitle( NS_CATEGORY, $row->cl_to );
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * Return an applicable autosummary if one exists for the given edit.
+ * @param string|null $oldtext The previous text of the page.
+ * @param string|null $newtext The submitted text of the page.
+ * @param int $flags Bitmask: a bitmask of flags submitted for the edit.
+ * @return string An appropriate autosummary, or an empty string.
+ *
+ * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
+ */
+ public static function getAutosummary( $oldtext, $newtext, $flags ) {
+ // NOTE: stub for backwards-compatibility. assumes the given text is
+ // wikitext. will break horribly if it isn't.
+
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+
+ $handler = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT );
+ $oldContent = is_null( $oldtext ) ? null : $handler->unserializeContent( $oldtext );
+ $newContent = is_null( $newtext ) ? null : $handler->unserializeContent( $newtext );
+
+ return $handler->getAutosummary( $oldContent, $newContent, $flags );
+ }
+
+ /**
+ * Auto-generates a deletion reason
+ *
+ * @param bool &$hasHistory Whether the page has a history
+ * @return string|bool String containing deletion reason or empty string, or boolean false
+ * if no revision occurred
+ */
+ public function getAutoDeleteReason( &$hasHistory ) {
+ return $this->getContentHandler()->getAutoDeleteReason( $this->getTitle(), $hasHistory );
+ }
+
+ /**
+ * Update all the appropriate counts in the category table, given that
+ * we've added the categories $added and deleted the categories $deleted.
+ *
+ * @param array $added The names of categories that were added
+ * @param array $deleted The names of categories that were deleted
+ */
+ public function updateCategoryCounts( array $added, array $deleted ) {
+ $that = $this;
+ $method = __METHOD__;
+ $dbw = wfGetDB( DB_MASTER );
+
+ // Do this at the end of the commit to reduce lock wait timeouts
+ $dbw->onTransactionPreCommitOrIdle(
+ function() use ( $dbw, $that, $method, $added, $deleted ) {
+ $ns = $that->getTitle()->getNamespace();
+
+ $addFields = array( 'cat_pages = cat_pages + 1' );
+ $removeFields = array( 'cat_pages = cat_pages - 1' );
+ if ( $ns == NS_CATEGORY ) {
+ $addFields[] = 'cat_subcats = cat_subcats + 1';
+ $removeFields[] = 'cat_subcats = cat_subcats - 1';
+ } elseif ( $ns == NS_FILE ) {
+ $addFields[] = 'cat_files = cat_files + 1';
+ $removeFields[] = 'cat_files = cat_files - 1';
+ }
+
+ if ( count( $added ) ) {
+ $insertRows = array();
+ foreach ( $added as $cat ) {
+ $insertRows[] = array(
+ 'cat_title' => $cat,
+ 'cat_pages' => 1,
+ 'cat_subcats' => ( $ns == NS_CATEGORY ) ? 1 : 0,
+ 'cat_files' => ( $ns == NS_FILE ) ? 1 : 0,
+ );
+ }
+ $dbw->upsert(
+ 'category',
+ $insertRows,
+ array( 'cat_title' ),
+ $addFields,
+ $method
+ );
+ }
+
+ if ( count( $deleted ) ) {
+ $dbw->update(
+ 'category',
+ $removeFields,
+ array( 'cat_title' => $deleted ),
+ $method
+ );
+ }
+
+ foreach ( $added as $catName ) {
+ $cat = Category::newFromName( $catName );
+ wfRunHooks( 'CategoryAfterPageAdded', array( $cat, $that ) );
+ }
+
+ foreach ( $deleted as $catName ) {
+ $cat = Category::newFromName( $catName );
+ wfRunHooks( 'CategoryAfterPageRemoved', array( $cat, $that ) );
+ }
+ }
+ );
+ }
+
+ /**
+ * Updates cascading protections
+ *
+ * @param ParserOutput $parserOutput ParserOutput object for the current version
+ */
+ public function doCascadeProtectionUpdates( ParserOutput $parserOutput ) {
+ if ( wfReadOnly() || !$this->mTitle->areRestrictionsCascading() ) {
+ return;
+ }
+
+ // templatelinks or imagelinks tables may have become out of sync,
+ // especially if using variable-based transclusions.
+ // For paranoia, check if things have changed and if
+ // so apply updates to the database. This will ensure
+ // that cascaded protections apply as soon as the changes
+ // are visible.
+
+ // Get templates from templatelinks and images from imagelinks
+ $id = $this->getId();
+
+ $dbLinks = array();
+
+ $dbr = wfGetDB( DB_SLAVE );
+ $res = $dbr->select( array( 'templatelinks' ),
+ array( 'tl_namespace', 'tl_title' ),
+ array( 'tl_from' => $id ),
+ __METHOD__
+ );
+
+ foreach ( $res as $row ) {
+ $dbLinks["{$row->tl_namespace}:{$row->tl_title}"] = true;
+ }
+
+ $dbr = wfGetDB( DB_SLAVE );
+ $res = $dbr->select( array( 'imagelinks' ),
+ array( 'il_to' ),
+ array( 'il_from' => $id ),
+ __METHOD__
+ );
+
+ foreach ( $res as $row ) {
+ $dbLinks[NS_FILE . ":{$row->il_to}"] = true;
+ }
+
+ // Get templates and images from parser output.
+ $poLinks = array();
+ foreach ( $parserOutput->getTemplates() as $ns => $templates ) {
+ foreach ( $templates as $dbk => $id ) {
+ $poLinks["$ns:$dbk"] = true;
+ }
+ }
+ foreach ( $parserOutput->getImages() as $dbk => $id ) {
+ $poLinks[NS_FILE . ":$dbk"] = true;
+ }
+
+ // Get the diff
+ $links_diff = array_diff_key( $poLinks, $dbLinks );
+
+ if ( count( $links_diff ) > 0 ) {
+ // Whee, link updates time.
+ // Note: we are only interested in links here. We don't need to get
+ // other DataUpdate items from the parser output.
+ $u = new LinksUpdate( $this->mTitle, $parserOutput, false );
+ $u->doUpdate();
+ }
+ }
+
+ /**
+ * Return a list of templates used by this article.
+ * Uses the templatelinks table
+ *
+ * @deprecated since 1.19; use Title::getTemplateLinksFrom()
+ * @return array Array of Title objects
+ */
+ public function getUsedTemplates() {
+ return $this->mTitle->getTemplateLinksFrom();
+ }
+
+ /**
+ * This function is called right before saving the wikitext,
+ * so we can do things like signatures and links-in-context.
+ *
+ * @deprecated since 1.19; use Parser::preSaveTransform() instead
+ * @param string $text Article contents
+ * @param User $user User doing the edit
+ * @param ParserOptions $popts Parser options, default options for
+ * the user loaded if null given
+ * @return string Article contents with altered wikitext markup (signatures
+ * converted, {{subst:}}, templates, etc.)
+ */
+ public function preSaveTransform( $text, User $user = null, ParserOptions $popts = null ) {
+ global $wgParser, $wgUser;
+
+ wfDeprecated( __METHOD__, '1.19' );
+
+ $user = is_null( $user ) ? $wgUser : $user;
+
+ if ( $popts === null ) {
+ $popts = ParserOptions::newFromUser( $user );
+ }
+
+ return $wgParser->preSaveTransform( $text, $this->mTitle, $user, $popts );
+ }
+
+ /**
+ * Check whether the number of revisions of this page surpasses $wgDeleteRevisionsLimit
+ *
+ * @deprecated since 1.19; use Title::isBigDeletion() instead.
+ * @return bool
+ */
+ public function isBigDeletion() {
+ wfDeprecated( __METHOD__, '1.19' );
+ return $this->mTitle->isBigDeletion();
+ }
+
+ /**
+ * Get the approximate revision count of this page.
+ *
+ * @deprecated since 1.19; use Title::estimateRevisionCount() instead.
+ * @return int
+ */
+ public function estimateRevisionCount() {
+ wfDeprecated( __METHOD__, '1.19' );
+ return $this->mTitle->estimateRevisionCount();
+ }
+
+ /**
+ * Update the article's restriction field, and leave a log entry.
+ *
+ * @deprecated since 1.19
+ * @param array $limit Set of restriction keys
+ * @param string $reason
+ * @param int &$cascade Set to false if cascading protection isn't allowed.
+ * @param array $expiry Per restriction type expiration
+ * @param User $user The user updating the restrictions
+ * @return bool true on success
+ */
+ public function updateRestrictions(
+ $limit = array(), $reason = '', &$cascade = 0, $expiry = array(), User $user = null
+ ) {
+ global $wgUser;
+
+ $user = is_null( $user ) ? $wgUser : $user;
+
+ return $this->doUpdateRestrictions( $limit, $expiry, $cascade, $reason, $user )->isOK();
+ }
+
+ /**
+ * Returns a list of updates to be performed when this page is deleted. The
+ * updates should remove any information about this page from secondary data
+ * stores such as links tables.
+ *
+ * @param Content|null $content Optional Content object for determining the
+ * necessary updates.
+ * @return array An array of DataUpdates objects
+ */
+ public function getDeletionUpdates( Content $content = null ) {
+ if ( !$content ) {
+ // load content object, which may be used to determine the necessary updates
+ // XXX: the content may not be needed to determine the updates, then this would be overhead.
+ $content = $this->getContent( Revision::RAW );
+ }
+
+ if ( !$content ) {
+ $updates = array();
+ } else {
+ $updates = $content->getDeletionUpdates( $this );
+ }
+
+ wfRunHooks( 'WikiPageDeletionUpdates', array( $this, $content, &$updates ) );
+ return $updates;
+ }
+}
* @private
*/
function replaceInternalLinks2( &$s ) {
+ global $wgExtraInterlanguageLinkPrefixes;
wfProfileIn( __METHOD__ );
wfProfileIn( __METHOD__ . '-setup' );
if ( $noforce ) {
# Interwikis
wfProfileIn( __METHOD__ . "-interwiki" );
- if ( $iw && $this->mOptions->getInterwikiMagic()
- && $nottalk && Language::fetchLanguageName( $iw, null, 'mw' )
+ if (
+ $iw && $this->mOptions->getInterwikiMagic() && $nottalk && (
+ Language::fetchLanguageName( $iw, null, 'mw' ) ||
+ in_array( $iw, $wgExtraInterlanguageLinkPrefixes )
+ )
) {
- // XXX: the above check prevents links to sites with identifiers that are not language codes
-
# Bug 24502: filter duplicates
if ( !isset( $this->mLangLinkLanguages[$iw] ) ) {
$this->mLangLinkLanguages[$iw] = true;
* External callers should use the getSection and replaceSection methods.
*
* @param string $text Page wikitext
- * @param string $section A section identifier string of the form:
+ * @param string|number $sectionId A section identifier string of the form:
* "<flag1> - <flag2> - ... - <section number>"
*
* Currently the only recognised flag is "T", which means the target section number
* @return string For "get", the extracted section text.
* for "replace", the whole page with the section replaced.
*/
- private function extractSections( $text, $section, $mode, $newText = '' ) {
+ private function extractSections( $text, $sectionId, $mode, $newText = '' ) {
global $wgTitle; # not generally used but removes an ugly failure mode
$magicScopeVariable = $this->lock();
# Process section extraction flags
$flags = 0;
- $sectionParts = explode( '-', $section );
+ $sectionParts = explode( '-', $sectionId );
$sectionIndex = array_pop( $sectionParts );
foreach ( $sectionParts as $part ) {
if ( $part === 'T' ) {
* If a section contains subsections, these are also returned.
*
* @param string $text Text to look in
- * @param string $section Section identifier
- * @param string $deftext Default to return if section is not found
+ * @param string|number $sectionId Section identifier as a number or string
+ * (e.g. 0, 1 or 'T-1').
+ * @param string $defaultText Default to return if section is not found
+ *
* @return string Text of the requested section
*/
- public function getSection( $text, $section, $deftext = '' ) {
- return $this->extractSections( $text, $section, "get", $deftext );
+ public function getSection( $text, $sectionId, $defaultText = '' ) {
+ return $this->extractSections( $text, $sectionId, 'get', $defaultText );
}
/**
* specified by $section has been replaced with $text. If the target
* section does not exist, $oldtext is returned unchanged.
*
- * @param string $oldtext Former text of the article
- * @param int $section Section identifier
- * @param string $text Replacing text
+ * @param string $oldText Former text of the article
+ * @param string|number $sectionId Section identifier as a number or string
+ * (e.g. 0, 1 or 'T-1').
+ * @param string $newText Replacing text
+ *
* @return string Modified text
*/
- public function replaceSection( $oldtext, $section, $text ) {
- return $this->extractSections( $oldtext, $section, "replace", $text );
+ public function replaceSection( $oldText, $sectionId, $newText ) {
+ return $this->extractSections( $oldText, $sectionId, 'replace', $newText );
}
/**
--- /dev/null
+<?php
+/**
+ * Fake parser that output the difference of two different parsers
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Parser
+ */
+
+/**
+ * @ingroup Parser
+ */
+class ParserDiffTest
+{
+ var $parsers, $conf;
+ var $shortOutput = false;
+
+ var $dtUniqPrefix;
+
+ function __construct( $conf ) {
+ if ( !isset( $conf['parsers'] ) ) {
+ throw new MWException( __METHOD__ . ': no parsers specified' );
+ }
+ $this->conf = $conf;
+ }
+
+ function init() {
+ if ( !is_null( $this->parsers ) ) {
+ return;
+ }
+
+ global $wgHooks;
+ static $doneHook = false;
+ if ( !$doneHook ) {
+ $doneHook = true;
+ $wgHooks['ParserClearState'][] = array( $this, 'onClearState' );
+ }
+ if ( isset( $this->conf['shortOutput'] ) ) {
+ $this->shortOutput = $this->conf['shortOutput'];
+ }
+
+ foreach ( $this->conf['parsers'] as $i => $parserConf ) {
+ if ( !is_array( $parserConf ) ) {
+ $class = $parserConf;
+ $parserConf = array( 'class' => $parserConf );
+ } else {
+ $class = $parserConf['class'];
+ }
+ $this->parsers[$i] = new $class( $parserConf );
+ }
+ }
+
+ function __call( $name, $args ) {
+ $this->init();
+ $results = array();
+ $mismatch = false;
+ $lastResult = null;
+ $first = true;
+ foreach ( $this->parsers as $i => $parser ) {
+ $currentResult = call_user_func_array( array( &$this->parsers[$i], $name ), $args );
+ if ( $first ) {
+ $first = false;
+ } else {
+ if ( is_object( $lastResult ) ) {
+ if ( $lastResult != $currentResult ) {
+ $mismatch = true;
+ }
+ } else {
+ if ( $lastResult !== $currentResult ) {
+ $mismatch = true;
+ }
+ }
+ }
+ $results[$i] = $currentResult;
+ $lastResult = $currentResult;
+ }
+ if ( $mismatch ) {
+ if ( count( $results ) == 2 ) {
+ $resultsList = array();
+ foreach ( $this->parsers as $i => $parser ) {
+ $resultsList[] = var_export( $results[$i], true );
+ }
+ $diff = wfDiff( $resultsList[0], $resultsList[1] );
+ } else {
+ $diff = '[too many parsers]';
+ }
+ $msg = "ParserDiffTest: results mismatch on call to $name\n";
+ if ( !$this->shortOutput ) {
+ $msg .= 'Arguments: ' . $this->formatArray( $args ) . "\n";
+ }
+ $msg .= 'Results: ' . $this->formatArray( $results ) . "\n" .
+ "Diff: $diff\n";
+ throw new MWException( $msg );
+ }
+ return $lastResult;
+ }
+
+ function formatArray( $array ) {
+ if ( $this->shortOutput ) {
+ foreach ( $array as $key => $value ) {
+ if ( $value instanceof ParserOutput ) {
+ $array[$key] = "ParserOutput: {$value->getText()}";
+ }
+ }
+ }
+ return var_export( $array, true );
+ }
+
+ function setFunctionHook( $id, $callback, $flags = 0 ) {
+ $this->init();
+ foreach ( $this->parsers as $parser ) {
+ $parser->setFunctionHook( $id, $callback, $flags );
+ }
+ }
+
+ /**
+ * @param Parser $parser
+ * @return bool
+ */
+ function onClearState( &$parser ) {
+ // hack marker prefixes to get identical output
+ if ( !isset( $this->dtUniqPrefix ) ) {
+ $this->dtUniqPrefix = $parser->uniqPrefix();
+ } else {
+ $parser->mUniqPrefix = $this->dtUniqPrefix;
+ }
+ return true;
+ }
+}
+++ /dev/null
-<?php
-/**
- * Fake parser that output the difference of two different parsers
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Parser
- */
-
-/**
- * @ingroup Parser
- */
-class Parser_DiffTest
-{
- var $parsers, $conf;
- var $shortOutput = false;
-
- var $dtUniqPrefix;
-
- function __construct( $conf ) {
- if ( !isset( $conf['parsers'] ) ) {
- throw new MWException( __METHOD__ . ': no parsers specified' );
- }
- $this->conf = $conf;
- }
-
- function init() {
- if ( !is_null( $this->parsers ) ) {
- return;
- }
-
- global $wgHooks;
- static $doneHook = false;
- if ( !$doneHook ) {
- $doneHook = true;
- $wgHooks['ParserClearState'][] = array( $this, 'onClearState' );
- }
- if ( isset( $this->conf['shortOutput'] ) ) {
- $this->shortOutput = $this->conf['shortOutput'];
- }
-
- foreach ( $this->conf['parsers'] as $i => $parserConf ) {
- if ( !is_array( $parserConf ) ) {
- $class = $parserConf;
- $parserConf = array( 'class' => $parserConf );
- } else {
- $class = $parserConf['class'];
- }
- $this->parsers[$i] = new $class( $parserConf );
- }
- }
-
- function __call( $name, $args ) {
- $this->init();
- $results = array();
- $mismatch = false;
- $lastResult = null;
- $first = true;
- foreach ( $this->parsers as $i => $parser ) {
- $currentResult = call_user_func_array( array( &$this->parsers[$i], $name ), $args );
- if ( $first ) {
- $first = false;
- } else {
- if ( is_object( $lastResult ) ) {
- if ( $lastResult != $currentResult ) {
- $mismatch = true;
- }
- } else {
- if ( $lastResult !== $currentResult ) {
- $mismatch = true;
- }
- }
- }
- $results[$i] = $currentResult;
- $lastResult = $currentResult;
- }
- if ( $mismatch ) {
- if ( count( $results ) == 2 ) {
- $resultsList = array();
- foreach ( $this->parsers as $i => $parser ) {
- $resultsList[] = var_export( $results[$i], true );
- }
- $diff = wfDiff( $resultsList[0], $resultsList[1] );
- } else {
- $diff = '[too many parsers]';
- }
- $msg = "Parser_DiffTest: results mismatch on call to $name\n";
- if ( !$this->shortOutput ) {
- $msg .= 'Arguments: ' . $this->formatArray( $args ) . "\n";
- }
- $msg .= 'Results: ' . $this->formatArray( $results ) . "\n" .
- "Diff: $diff\n";
- throw new MWException( $msg );
- }
- return $lastResult;
- }
-
- function formatArray( $array ) {
- if ( $this->shortOutput ) {
- foreach ( $array as $key => $value ) {
- if ( $value instanceof ParserOutput ) {
- $array[$key] = "ParserOutput: {$value->getText()}";
- }
- }
- }
- return var_export( $array, true );
- }
-
- function setFunctionHook( $id, $callback, $flags = 0 ) {
- $this->init();
- foreach ( $this->parsers as $parser ) {
- $parser->setFunctionHook( $id, $callback, $flags );
- }
- }
-
- /**
- * @param Parser $parser
- * @return bool
- */
- function onClearState( &$parser ) {
- // hack marker prefixes to get identical output
- if ( !isset( $this->dtUniqPrefix ) ) {
- $this->dtUniqPrefix = $parser->uniqPrefix();
- } else {
- $parser->mUniqPrefix = $this->dtUniqPrefix;
- }
- return true;
- }
-}
const STRIP_COMMENTS = 4;
const NO_IGNORE = 8;
const RECOVER_COMMENTS = 16;
+ const NO_TAGS = 32;
- const RECOVER_ORIG = 27; // = 1|2|8|16 no constant expression support in PHP yet
+ const RECOVER_ORIG = 59; // = 1|2|8|16|32 no constant expression support in PHP yet
/** This constant exists when $indexOffset is supported in newChild() */
const SUPPORTS_INDEX_OFFSET = 1;
$attrs = $xpath->query( 'attr', $contextNode );
$inners = $xpath->query( 'inner', $contextNode );
$closes = $xpath->query( 'close', $contextNode );
- $params = array(
- 'name' => new PPNode_DOM( $names->item( 0 ) ),
- 'attr' => $attrs->length > 0 ? new PPNode_DOM( $attrs->item( 0 ) ) : null,
- 'inner' => $inners->length > 0 ? new PPNode_DOM( $inners->item( 0 ) ) : null,
- 'close' => $closes->length > 0 ? new PPNode_DOM( $closes->item( 0 ) ) : null,
- );
- $out .= $this->parser->extensionSubstitution( $params, $this );
+ if ( $flags & PPFrame::NO_TAGS ) {
+ $s = '<' . $this->expand( $names->item( 0 ), $flags );
+ if ( $attrs->length > 0 ) {
+ $s .= $this->expand( $attrs->item( 0 ), $flags );
+ }
+ if ( $inners->length > 0 ) {
+ $s .= '>' . $this->expand( $inners->item( 0 ), $flags );
+ if ( $closes->length > 0 ) {
+ $s .= $this->expand( $closes->item( 0 ), $flags );
+ }
+ } else {
+ $s .= '/>';
+ }
+ $out .= $s;
+ } else {
+ $params = array(
+ 'name' => new PPNode_DOM( $names->item( 0 ) ),
+ 'attr' => $attrs->length > 0 ? new PPNode_DOM( $attrs->item( 0 ) ) : null,
+ 'inner' => $inners->length > 0 ? new PPNode_DOM( $inners->item( 0 ) ) : null,
+ 'close' => $closes->length > 0 ? new PPNode_DOM( $closes->item( 0 ) ) : null,
+ );
+ $out .= $this->parser->extensionSubstitution( $params, $this );
+ }
} elseif ( $contextNode->nodeName == 'h' ) {
# Heading
$s = $this->expand( $contextNode->childNodes, $flags );
} elseif ( $contextNode->name == 'ext' ) {
# Extension tag
$bits = $contextNode->splitExt() + array( 'attr' => null, 'inner' => null, 'close' => null );
- $out .= $this->parser->extensionSubstitution( $bits, $this );
+ if ( $flags & PPFrame::NO_TAGS ) {
+ $s = '<' . $bits['name']->firstChild->value;
+ if ( $bits['attr'] ) {
+ $s .= $bits['attr']->firstChild->value;
+ }
+ if ( $bits['inner'] ) {
+ $s .= '>' . $bits['inner']->firstChild->value;
+ if ( $bits['close'] ) {
+ $s .= $bits['close']->firstChild->value;
+ }
+ } else {
+ $s .= '/>';
+ }
+ $out .= $s;
+ } else {
+ $out .= $this->parser->extensionSubstitution( $bits, $this );
+ }
} elseif ( $contextNode->name == 'h' ) {
# Heading
if ( $this->parser->ot['html'] ) {
}
switch ( $status->value ) {
+ case PoolCounter::LOCK_HELD:
+ // Better to ignore nesting pool counter limits than to fail.
+ // Assume that the outer pool limiting is reasonable enough.
+ /* no break */
case PoolCounter::LOCKED:
$result = $this->doWork();
$this->poolCounter->release();
--- /dev/null
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class PoolWorkArticleView extends PoolCounterWork {
+ /** @var Page */
+ private $page;
+
+ /** @var string */
+ private $cacheKey;
+
+ /** @var int */
+ private $revid;
+
+ /** @var ParserOptions */
+ private $parserOptions;
+
+ /** @var Content|null */
+ private $content = null;
+
+ /** @var ParserOutput|bool */
+ private $parserOutput = false;
+
+ /** @var bool */
+ private $isDirty = false;
+
+ /** @var Status|bool */
+ private $error = false;
+
+ /**
+ * @param Page $page
+ * @param int $revid ID of the revision being parsed.
+ * @param bool $useParserCache Whether to use the parser cache.
+ * @param ParserOptions $parserOptions ParserOptions to use for the parse
+ * operation.
+ * @param Content|string $content Content to parse or null to load it; may
+ * also be given as a wikitext string, for BC.
+ */
+ public function __construct( Page $page, ParserOptions $parserOptions,
+ $revid, $useParserCache, $content = null
+ ) {
+ if ( is_string( $content ) ) { // BC: old style call
+ $modelId = $page->getRevision()->getContentModel();
+ $format = $page->getRevision()->getContentFormat();
+ $content = ContentHandler::makeContent( $content, $page->getTitle(), $modelId, $format );
+ }
+
+ $this->page = $page;
+ $this->revid = $revid;
+ $this->cacheable = $useParserCache;
+ $this->parserOptions = $parserOptions;
+ $this->content = $content;
+ $this->cacheKey = ParserCache::singleton()->getKey( $page, $parserOptions );
+ parent::__construct( 'ArticleView', $this->cacheKey . ':revid:' . $revid );
+ }
+
+ /**
+ * Get the ParserOutput from this object, or false in case of failure
+ *
+ * @return ParserOutput
+ */
+ public function getParserOutput() {
+ return $this->parserOutput;
+ }
+
+ /**
+ * Get whether the ParserOutput is a dirty one (i.e. expired)
+ *
+ * @return bool
+ */
+ public function getIsDirty() {
+ return $this->isDirty;
+ }
+
+ /**
+ * Get a Status object in case of error or false otherwise
+ *
+ * @return Status|bool
+ */
+ public function getError() {
+ return $this->error;
+ }
+
+ /**
+ * @return bool
+ */
+ public function doWork() {
+ global $wgUseFileCache;
+
+ // @todo several of the methods called on $this->page are not declared in Page, but present
+ // in WikiPage and delegated by Article.
+
+ $isCurrent = $this->revid === $this->page->getLatest();
+
+ if ( $this->content !== null ) {
+ $content = $this->content;
+ } elseif ( $isCurrent ) {
+ // XXX: why use RAW audience here, and PUBLIC (default) below?
+ $content = $this->page->getContent( Revision::RAW );
+ } else {
+ $rev = Revision::newFromTitle( $this->page->getTitle(), $this->revid );
+
+ if ( $rev === null ) {
+ $content = null;
+ } else {
+ // XXX: why use PUBLIC audience here (default), and RAW above?
+ $content = $rev->getContent();
+ }
+ }
+
+ if ( $content === null ) {
+ return false;
+ }
+
+ // Reduce effects of race conditions for slow parses (bug 46014)
+ $cacheTime = wfTimestampNow();
+
+ $time = - microtime( true );
+ $this->parserOutput = $content->getParserOutput(
+ $this->page->getTitle(),
+ $this->revid,
+ $this->parserOptions
+ );
+ $time += microtime( true );
+
+ // Timing hack
+ if ( $time > 3 ) {
+ wfDebugLog( 'slow-parse', sprintf( "%-5.2f %s", $time,
+ $this->page->getTitle()->getPrefixedDBkey() ) );
+ }
+
+ if ( $this->cacheable && $this->parserOutput->isCacheable() && $isCurrent ) {
+ ParserCache::singleton()->save(
+ $this->parserOutput, $this->page, $this->parserOptions, $cacheTime, $this->revid );
+ }
+
+ // Make sure file cache is not used on uncacheable content.
+ // Output that has magic words in it can still use the parser cache
+ // (if enabled), though it will generally expire sooner.
+ if ( !$this->parserOutput->isCacheable() || $this->parserOutput->containsOldMagic() ) {
+ $wgUseFileCache = false;
+ }
+
+ if ( $isCurrent ) {
+ $this->page->doCascadeProtectionUpdates( $this->parserOutput );
+ }
+
+ return true;
+ }
+
+ /**
+ * @return bool
+ */
+ public function getCachedWork() {
+ $this->parserOutput = ParserCache::singleton()->get( $this->page, $this->parserOptions );
+
+ if ( $this->parserOutput === false ) {
+ wfDebug( __METHOD__ . ": parser cache miss\n" );
+ return false;
+ } else {
+ wfDebug( __METHOD__ . ": parser cache hit\n" );
+ return true;
+ }
+ }
+
+ /**
+ * @return bool
+ */
+ public function fallback() {
+ $this->parserOutput = ParserCache::singleton()->getDirty( $this->page, $this->parserOptions );
+
+ if ( $this->parserOutput === false ) {
+ wfDebugLog( 'dirty', 'dirty missing' );
+ wfDebug( __METHOD__ . ": no dirty cache\n" );
+ return false;
+ } else {
+ wfDebug( __METHOD__ . ": sending dirty output\n" );
+ wfDebugLog( 'dirty', "dirty output {$this->cacheKey}" );
+ $this->isDirty = true;
+ return true;
+ }
+ }
+
+ /**
+ * @param Status $status
+ * @return bool
+ */
+ public function error( $status ) {
+ $this->error = $status;
+ return false;
+ }
+}
$this->db = wfGetDB( DB_SLAVE );
}
}
+
+ /**
+ * Return a 'cleaned up' search string
+ *
+ * @param string $text
+ * @return string
+ */
+ protected function filter( $text ) {
+ $lc = $this->legalSearchChars();
+ return trim( preg_replace( "/[^{$lc}]/", " ", $text ) );
+ }
}
return $formatted;
}
- /**
- * Return a 'cleaned up' search string
- *
- * @param string $text
- * @return string
- */
- function filter( $text ) {
- $lc = $this->legalSearchChars();
- return trim( preg_replace( "/[^{$lc}]/", " ", $text ) );
- }
-
/**
* Load up the appropriate search engine class for the currently
* active database backend, and return a configured instance.
}
}
-/**
- * @ingroup Search
- */
-class SearchResultTooMany {
- # # Some search engines may bail out if too many matches are found
-}
-
/**
* Dummy class to be used when non-supported Database engine is present.
* @todo FIXME: Dummy class should probably try something at least mildly useful,
$olderror = error_reporting( E_ERROR );
$resultSet = $this->db->resultObject( $this->db->query( $q, 'SearchPostgres', true ) );
error_reporting( $olderror );
- if ( !$resultSet ) {
- // Needed for "Query requires full scan, GIN doesn't support it"
- return new SearchResultTooMany();
- }
return new PostgresSearchResultSet( $resultSet, $this->searchTerms );
}
$olderror = error_reporting( E_ERROR );
$resultSet = $this->db->resultObject( $this->db->query( $q, 'SearchPostgres', true ) );
error_reporting( $olderror );
- if ( !$resultSet ) {
- return new SearchResultTooMany();
- }
return new PostgresSearchResultSet( $resultSet, $this->searchTerms );
}
return 0;
}
- /**
- * Return true if results are included in this result set.
- * STUB
- *
- * @return bool
- */
- function hasResults() {
- return false;
- }
-
/**
* Some search modes return a total hit count for the query
* in the entire article database. This may include pages
$this->result = $match;
}
- public function hasResult() {
- return (bool)$this->result;
- }
-
public function numRows() {
- return $this->hasResults() ? 1 : 0;
+ return $this->result ? 1 : 0;
}
public function next() {
return $this->mRestriction;
}
- /**
- * Get the file which will be included by SpecialPage::execute() if your extension is
- * still stuck in the past and hasn't overridden the execute() method. No modern code
- * should want or need to know this.
- * @return string
- * @deprecated since 1.18
- */
- function getFile() {
- wfDeprecated( __METHOD__, '1.18' );
-
- return $this->mFile;
- }
-
// @todo FIXME: Decide which syntax to use for this, and stick to it
/**
* Whether this special page is listed in Special:SpecialPages
return $this->getContext()->getSkin();
}
- /**
- * Shortcut to get user's language
- *
- * @deprecated since 1.19 Use getLanguage instead
- * @return Language
- * @since 1.18
- */
- public function getLang() {
- wfDeprecated( __METHOD__, '1.19' );
-
- return $this->getLanguage();
- }
-
/**
* Shortcut to get user's language
*
return new $className;
} elseif ( is_array( $rec ) ) {
- // @deprecated, officially since 1.18, unofficially since forever
- wfDebug( "Array syntax for \$wgSpecialPages is deprecated, " .
- "define a subclass of SpecialPage instead." );
$className = array_shift( $rec );
+ // @deprecated, officially since 1.18, unofficially since forever
+ wfDeprecated( "Array syntax for \$wgSpecialPages is deprecated ($className), " .
+ "define a subclass of SpecialPage instead.", '1.18' );
self::getList()->$realName = MWFunction::newObj( $className, $rec );
}
* Return categorised listable special pages which are available
* for the current user, and everyone.
*
- * @param User $user User object to check permissions, $wgUser will be used if
- * if not provided
+ * @param User $user User object to check permissions, $wgUser will be used
+ * if not provided
* @return array ( string => Specialpage )
*/
public static function getUsablePages( User $user = null ) {
return true;
}
+ public function isRestricted() {
+ return true;
+ }
+
+ public function userCanExecute( User $user ) {
+ return $user->isAllowed( 'createaccount' );
+ }
+
protected function getGroupName() {
return 'login';
}
$out->addHTML( $tmp );
- $rawhtml = $this->generateHtml( $title, $output );
-
+ $pout = $this->generateHtml( $title, $output );
+ $rawhtml = $pout->getText();
if ( $this->generateRawHtml && strlen( $rawhtml ) > 0 ) {
$out->addHTML( $this->makeOutput( $rawhtml, 'expand_templates_html_output' ) );
}
- $this->showHtmlPreview( $title, $rawhtml, $out );
+ $this->showHtmlPreview( $title, $pout, $out );
}
}
*
* @param Title $title
* @param string $text
- * @return string
+ * @return ParserOutput
*/
private function generateHtml( Title $title, $text ) {
global $wgParser;
$popts = ParserOptions::newFromContext( $this->getContext() );
$popts->setTargetLanguage( $title->getPageLanguage() );
- $pout = $wgParser->parse( $text, $title, $popts );
-
- return $pout->getText();
+ return $wgParser->parse( $text, $title, $popts );
}
/**
* Wraps the provided html code in a div and outputs it to the page
*
* @param Title $title
- * @param string $html
+ * @param ParserOutput $pout
* @param OutputPage $out
*/
- private function showHtmlPreview( Title $title, $html, OutputPage $out ) {
+ private function showHtmlPreview( Title $title, ParserOutput $pout, OutputPage $out ) {
$lang = $title->getPageViewLanguage();
$out->addHTML( "<h2>" . $this->msg( 'expand_templates_preview' )->escaped() . "</h2>\n" );
$out->addHTML( Html::openElement( 'div', array(
'dir' => $lang->getDir(),
'lang' => $lang->getHtmlCode(),
) ) );
- $out->addHTML( $html );
+ $out->addParserOutputContent( $pout );
$out->addHTML( Html::closeElement( 'div' ) );
}
}
public function getQueryInfo() {
+ $minorType = array();
+ if ( $this->minor !== '*' ) {
+ // Allow wildcard searching
+ $minorType['img_minor_mime'] = $this->minor;
+ }
$qi = array(
'tables' => array( 'image' ),
'fields' => array(
),
'conds' => array(
'img_major_mime' => $this->major,
- 'img_minor_mime' => $this->minor,
// This is in order to trigger using
// the img_media_mime index in "range" mode.
'img_media_type' => array(
MEDIATYPE_EXECUTABLE,
MEDIATYPE_ARCHIVE,
),
- ),
+ ) + $minorType,
);
return $qi;
$last = $this->message['last'];
$ts = wfTimestamp( TS_MW, $row->rev_timestamp );
- $checkBox = Xml::radio( 'mergepoint', $ts, false );
+ $checkBox = Xml::radio( 'mergepoint', $ts, ( $this->mTimestamp === $ts ) );
$user = $this->getUser();
->rawParams( $checkBox, $last, $pageLink, $userLink, $stxt, $comment )->escaped() );
}
+ /**
+ * Actually attempt the history move
+ *
+ * @todo: if all versions of page A are moved to B and then a user
+ * tries to do a reverse-merge via the "unmerge" log link, then page
+ * A will still be a redirect (as it was after the original merge),
+ * though it will have the old revisions back from before (as expected).
+ * The user may have to "undo" the redirect manually to finish the "unmerge".
+ * Maybe this should delete redirects at the target page of merges?
+ *
+ * @return boolean Success
+ */
function merge() {
# Get the titles directly from the IDs, in case the target page params
# were spoofed. The queries are done based on the IDs, so it's best to
return false;
}
- # Update the revisions
+ # Get the timestamp pivot condition
if ( $this->mTimestamp ) {
$timewhere = "rev_timestamp <= {$this->mTimestamp}";
$timestampLimit = wfTimestamp( TS_MW, $this->mTimestamp );
$timewhere = "rev_timestamp <= {$maxtimestamp}";
$timestampLimit = wfTimestamp( TS_MW, $lasttimestamp );
}
+ # Check that there are not too many revisions to move
+ $limit = 5000; // avoid too much slave lag
+ $count = $dbw->select( 'revision', '1',
+ array( 'rev_page' => $this->mTargetID, $timewhere ),
+ __METHOD__,
+ array( 'LIMIT' => $limit + 1 )
+ )->numRows();
+ if ( $count > $limit ) {
+ $this->getOutput()->addWikiMsg( 'mergehistory-fail-toobig' );
+
+ return false;
+ }
# Do the moving...
$dbw->update(
'revision',
array( $destTitle->getPrefixedText(), $timestampLimit ), $this->getUser()
);
+ # @TODO: message should use redirect=no
$this->getOutput()->addWikiMsg( 'mergehistory-success',
$targetTitle->getPrefixedText(), $destTitle->getPrefixedText(), $count );
}
protected function setup( $par ) {
- global $wgEnableNewpagesUserFilter;
-
// Options
$opts = new FormOptions();
$this->opts = $opts; // bind
// Validate
$opts->validateIntBounds( 'limit', 0, 5000 );
- if ( !$wgEnableNewpagesUserFilter ) {
- $opts->setValue( 'username', '' );
- }
}
protected function parseParams( $par ) {
}
protected function form() {
- global $wgEnableNewpagesUserFilter, $wgScript;
+ global $wgScript;
// Consume values
$this->opts->consumeValue( 'offset' ); // don't carry offset, DWIW
$tagFilterSelector .
'</td>
</tr>' ) : '' ) .
- ( $wgEnableNewpagesUserFilter ?
- '<tr>
+ '<tr>
<td class="mw-label">' .
Xml::label( $this->msg( 'newpages-username' )->text(), 'mw-np-username' ) .
'</td>
<td class="mw-input">' .
Xml::input( 'username', 30, $userText, array( 'id' => 'mw-np-username' ) ) .
'</td>
- </tr>' : '' ) .
+ </tr>' .
'<tr> <td></td>
<td class="mw-submit">' .
Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
}
function getQueryInfo() {
- global $wgEnableNewpagesUserFilter;
$conds = array();
$conds['rc_new'] = 1;
}
}
- # $wgEnableNewpagesUserFilter - temp WMF hack
- if ( $wgEnableNewpagesUserFilter && $user ) {
+ if ( $user ) {
$conds['rc_user_text'] = $user->getText();
$rcIndexes = 'rc_user_text';
} elseif ( User::groupHasPermission( '*', 'createpage' ) &&
$rewritten = $search->replacePrefixes( $term );
$titleMatches = $search->searchTitle( $rewritten );
- if ( !( $titleMatches instanceof SearchResultTooMany ) ) {
- $textMatches = $search->searchText( $rewritten );
- }
+ $textMatches = $search->searchText( $rewritten );
$textStatus = null;
if ( $textMatches instanceof Status ) {
Xml::closeElement( 'div' )
);
- // Sometimes the search engine knows there are too many hits
- if ( $titleMatches instanceof SearchResultTooMany ) {
- $out->wrapWikiMsg( "==$1==\n", 'toomanymatches' );
-
- return;
- }
-
$filePrefix = $wgContLang->getFormattedNsText( NS_FILE ) . ':';
if ( trim( $term ) === '' || $filePrefix === trim( $term ) ) {
$out->addHTML( $this->formHeader( $term, 0, 0 ) );
$allMsgs = array();
$catDesc = $catMsg . '-desc';
$catMsgTitle = Title::makeTitleSafe( NS_MEDIAWIKI, $catMsg );
+ if ( !$catMsgTitle ) {
+ continue;
+ }
$catMsgTitleText = Linker::link(
$catMsgTitle,
htmlspecialchars( $catMsg )
);
- if ( strpos( $msgObj->plain(), '{{NAMESPACE}}' ) !== false ) {
+ // Match things like {{NAMESPACE}} and {{NAMESPACENUMBER}}.
+ // False positives are ok, this is just an efficiency shortcut
+ if ( strpos( $msgObj->plain(), '{{' ) !== false ) {
$ns = MWNamespace::getValidNamespaces();
foreach ( $ns as $namesp ) {
$tempTitle = Title::makeTitleSafe( $namesp, $catMsg );
+ if ( !$tempTitle ) {
+ continue;
+ }
$catName = $msgObj->title( $tempTitle )->text();
- if ( !$msgObj->isDisabled() ) {
+ # Allow tracking categories to be disabled by setting them to "-"
+ if ( $catName !== '-' ) {
$catTitle = Title::makeTitleSafe( NS_CATEGORY, $catName );
+ if ( $catTitle ) {
+ $catTitleText = Linker::link(
+ $catTitle,
+ htmlspecialchars( $catName )
+ );
+ $allMsgs[] = $catTitleText;
+ }
+ }
+ }
+ } else {
+ $catName = $msgObj->text();
+ # Allow tracking categories to be disabled by setting them to "-"
+ if ( $catName !== '-' ) {
+ $catTitle = Title::makeTitleSafe( NS_CATEGORY, $catName );
+ if ( $catTitle ) {
$catTitleText = Linker::link(
$catTitle,
htmlspecialchars( $catName )
$allMsgs[] = $catTitleText;
}
}
- } else {
- $catName = $msgObj->text();
- if ( !$msgObj->isDisabled() ) {
- $catTitle = Title::makeTitleSafe( NS_CATEGORY, $catName );
- $catTitleText = Linker::link(
- $catTitle,
- htmlspecialchars( $catName )
- );
- } else {
- $catTitleText = $this->msg( 'trackingcategories-disabled' )->parse();
- }
- $allMsgs[] = $catTitleText;
+ }
+
+ # Extra message, when no category was found
+ if ( !count( $allMsgs ) ) {
+ $allMsgs[] = $this->msg( 'trackingcategories-disabled' )->parse();
}
/*
// We must obtain the information for all the bits and pieces!
// ... such as extension names and links
- $extensionName = isset( $extension['name'] ) ? $extension['name'] : '[no name]';
+ if ( isset( $extension['namemsg'] ) ) {
+ // Localized name of extension
+ $extensionName = $this->msg( $extension['namemsg'] )->text();
+ } elseif ( isset( $extension['name'] ) ) {
+ // Non localized version
+ $extensionName = $extension['name'];
+ } else {
+ $extensionName = $this->msg( 'version-no-ext-name' )->text();
+ }
+
if ( isset( $extension['url'] ) ) {
$extensionNameLink = Linker::makeExternalLink(
$extension['url'],
/**
* Used by date() and time() to adjust the time output.
*
- * @param int $ts The time in date('YmdHis') format
+ * @param string $ts The time in date('YmdHis') format
* @param mixed $tz Adjust the time by this amount (default false, mean we
* get user timecorrection setting)
* @return int
}
/**
- * @param mixed $ts The time format which needs to be turned into a
+ * @param string $ts The time format which needs to be turned into a
* date('YmdHis') format with wfTimestamp(TS_MW,$ts)
* @param bool $adj Whether to adjust the time output according to the
* user configured offset ($timecorrection)
}
/**
- * @param mixed $ts The time format which needs to be turned into a
+ * @param string $ts The time format which needs to be turned into a
* date('YmdHis') format with wfTimestamp(TS_MW,$ts)
* @param bool $adj Whether to adjust the time output according to the
* user configured offset ($timecorrection)
}
/**
- * @param mixed $ts The time format which needs to be turned into a
+ * @param string $ts The time format which needs to be turned into a
* date('YmdHis') format with wfTimestamp(TS_MW,$ts)
* @param bool $adj Whether to adjust the time output according to the
* user configured offset ($timecorrection)
* Internal helper function for userDate(), userTime() and userTimeAndDate()
*
* @param string $type Can be 'date', 'time' or 'both'
- * @param mixed $ts The time format which needs to be turned into a
+ * @param string $ts The time format which needs to be turned into a
* date('YmdHis') format with wfTimestamp(TS_MW,$ts)
* @param User $user User object used to get preferences for timezone and format
* @param array $options Array, can contain the following keys:
* @param Content $content New page content
* @param string $summary Edit summary of the edit
* @param bool $isMinor Was the edit marked as minor?
- * @param bool $isWatch Did the user watch this page or not?
- * @param string|int $section
+ * @param null $isWatch Unused.
+ * @param null $section Unused.
* @param int $flags Bitfield
* @param Revision|null $revision New Revision object or null
* @return bool True
"qbmyoptions": "My bladsye",
"faq": "Gewilde vrae",
"faqpage": "Project:GewildeVrae",
- "vector-action-addsection": "Nuwe onderwerp",
- "vector-action-delete": "Skrap",
- "vector-action-move": "Skuif",
- "vector-action-protect": "Beskerm",
- "vector-action-undelete": "Ontskrap",
- "vector-action-unprotect": "Wysig beskerming",
- "vector-view-create": "Skep",
- "vector-view-edit": "Wysig",
- "vector-view-history": "Wys geskiedenis",
- "vector-view-view": "Lees",
- "vector-view-viewsource": "Wys bronteks",
"actions": "Aksies",
- "vector-more-actions": "Meer",
"namespaces": "Naamruimtes",
"variants": "Variante",
"navigation-heading": "Navigasie-keuseskerm",
"difference-missing-revision": "{{PLURAL:$2|'n Weergawe|$2 weergawes}} van die verskil ($1) {{PLURAL:$2|is|is}} nie gevind nie.\n\nDit word meestal veroorsaak deur die volg van 'n verouderde verwysing na 'n bladsy wat verwyder is.\nDetails kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} skraplogboek] gevind word.",
"searchresults": "Soekresultate",
"searchresults-title": "Soekresultate vir \"$1\"",
- "toomanymatches": "Te veel resultate. Probeer asseblief 'n ander soektog.",
"titlematches": "Artikeltitel resultate",
"textmatches": "Artikelteks resultate",
"notextmatches": "Geen artikelteks resultate nie",
"qbmyoptions": "የኔ ገጾች",
"faq": "ብጊየጥ (ብዙ ጊዜ የሚጠየቁ ጥያቀዎች)",
"faqpage": "Project:ብጊየጥ",
- "vector-action-addsection": "ርዕስ ጨምር",
- "vector-action-delete": "አጥፋ",
- "vector-action-move": "ለማዛወር",
- "vector-action-protect": "ለመቆለፍ",
- "vector-action-undelete": "አታጥፋ",
- "vector-action-unprotect": "አለመቆለፍ",
- "vector-view-create": "አዲስ ፍጠር",
- "vector-view-edit": "አርም",
- "vector-view-history": "ታሪኩን አሳይ",
- "vector-view-view": "ለማንበብ",
- "vector-view-viewsource": "ጥሬ ኮድ ለመመልከት",
"actions": "ድርጊቶች",
"namespaces": "ክፍለ-ዊኪዎች",
"errorpagetitle": "ስህተት",
"edit-gone-missing": "ገጹን ማሳደስ አልተቻለም። እንደ ጠፋ ይመስላል።",
"edit-conflict": "ተቃራኒ ለውጥ።",
"edit-no-change": "በጽሕፈቱ አንዳችም አልተለወጠምና ለውጥዎ ቸል ተብሏል።",
+ "postedit-confirmation-saved": "እርማትዎ ተቆጥቧል",
"edit-already-exists": "አዲስ ገጽ ለመፍጠር አልተቻለም፤\nገና ይኖራልና።",
"defaultmessagetext": "የቆየው ጽሕፈት",
"content-model-javascript": "ጃቫ ስክሪፕት",
"editundo": "ለውጡ ይገልበጥ",
"searchresults": "የፍለጋ ውጤቶች",
"searchresults-title": "ለ\"$1\" የፍለጋ ውጤቶች",
- "toomanymatches": "ከመጠን በላይ ያሉ ስምምነቶች ተመለሱ፤ እባክዎ ሌላ ጥያቄ ይሞክሩ።",
"titlematches": "የሚስማሙ አርዕስቶች",
"textmatches": "ጽሕፈት የሚስማማባቸው ገጾች",
"notextmatches": "ጽሕፈት የሚስማማባቸው ገጾች የሉም",
"qbmyoptions": "Mīne trametas",
"faq": "Oftost ascoda ascunga",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Besettan mearcunge",
- "vector-action-delete": "Forlēosan",
- "vector-action-move": "Wegan",
- "vector-action-protect": "Beorgan",
- "vector-action-undelete": "Scieppan tramet eft",
- "vector-action-unprotect": "Andwendan beorgunge",
- "vector-view-create": "Scieppan",
- "vector-view-edit": "Adihtan",
- "vector-view-history": "Stǣr",
- "vector-view-view": "Rǣdan",
- "vector-view-viewsource": "Sēon fruman",
"actions": "Fremmunga",
"namespaces": "Namstedas",
"variants": "Missenlīcnessa",
"qbmyoptions": "صفحاتي",
"faq": "الأسئلة المتكررة",
"faqpage": "Project:أسئلة متكررة",
- "vector-action-addsection": "أضف موضوعا",
- "vector-action-delete": "احذف",
- "vector-action-move": "انقل",
- "vector-action-protect": "احم",
- "vector-action-undelete": "ألغ الحذف",
- "vector-action-unprotect": "غير الحماية",
- "vector-view-create": "أنشئ",
- "vector-view-edit": "عدل",
- "vector-view-history": "اعرض التاريخ",
- "vector-view-view": "اقرأ",
- "vector-view-viewsource": "اعرض المصدر",
"actions": "أفعال",
- "vector-more-actions": "مزيد",
"namespaces": "فضاءات التسمية",
"variants": "المتغيرات",
"navigation-heading": "قائمة التصفح",
"node-count-exceeded-category": "تجاوزات تعداد العقد",
"node-count-exceeded-warning": "تجاوزت هذه الصفحة تعداد العقد",
"expansion-depth-exceeded-category": "تجاوزات عمق التوسيع",
+ "expansion-depth-exceeded-category-desc": "هذا تصنيف للصفحات التي تتجاوز عمق التوسيع.",
"expansion-depth-exceeded-warning": "الصفحة تجاوزت عمق التوسيع",
"parser-unstrip-loop-warning": "حلقة معراة تم الكشف عنها",
"parser-unstrip-recursion-limit": "تعدى حد العودية Unstrip ($1)",
"revdelete-show-file-confirm": "هل أنت متأكد أنك تريد رؤية مراجعة محذوفة للملف \"<nowiki>$1</nowiki>\" بتاريخ $2 الساعة $3؟",
"revdelete-show-file-submit": "نعم",
"logdelete-selected": "{{PLURAL:$1|حدث السجل المختار|أحداث السجل المختارة}}:",
+ "revdelete-text-others": "سيتمكن الإداريون الآخرون على {{SITENAME}} من الوصول إلى المحتوى المخفي وإلغاء حذفه مجددا من خلال ذات الواجهة ما لم تطبق قيود إضافية.",
"revdelete-confirm": "الإداريون الآخرون في {{SITENAME}} سيظل بإمكانهم رؤية المحتوى المخفي ويمكنهم استرجاعه مجددا من خلال هذه الواجهة نفسها، مالم يتم وضع قيود إضافية.\nمن فضلك أكد أنك تنوي فعل هذا، وأنك تفهم العواقب، وأنك تفعل هذا بالتوافق مع [[{{MediaWiki:Policy-url}}|السياسة]].",
"revdelete-suppress-text": "ينبغي للإخفاء أن يستخدم '''فقط''' في الحالات التالية:\n* معلومات يحتمل أن تكون تشهيرية\n* معلومات شخصية غير ملائمة\n*: ''عناوين المنازل وأرقام الهواتف وأرقام الهويات الوطنية إلى آخره.''",
"revdelete-legend": "وضع ضوابط رؤية",
"difference-missing-revision": "{{PLURAL:$2|مراجعة واحدة|$2 مراجعات}} لهذا الفرق ($1) {{PLURAL:$2|لم|لم}} يتم إيجادها.\n\nهذا يحدث عادة عن طريق اتباع وصلة فرق قديمة لصفحة تم حذفها.\nالتفاصيل يمكن إيجادها في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
"searchresults": "نتائج البحث",
"searchresults-title": "نتائج البحث عن \"$1\"",
- "toomanymatches": "وجدت مطابقات كثيرة، من فضلك جرب استعلاما مختلفا",
"titlematches": "عنوان الصفحة يطابق",
"textmatches": "نص الصفحة يطابق",
"notextmatches": "لم يتم إيجاد أي نص مطابق",
"pageswithprop-prophidden-binary": "قيمة الخاصية الثنائية المخفية ($1)",
"doubleredirects": "تحويلات مزدوجة",
"doubleredirectstext": "هذه الصفحة تعرض الصفحات التي تحول إلى صفحات تحويل أخرى.\nكل سطر يحتوي على وصلات للتحويلة الأولى والثانية وهدف التحويلة الثانية، والذي عادة ما يشير إلى صفحة الهدف \"الحقيقية\"، التي من المفترض أن تحول إليها التحويلة الأولى.\nالمدخلات <del>المشطوبة</del> صححت.",
- "double-redirect-fixed-move": "[[$1]] تم نقلها، هي الآن تحويلة إلى [[$2]]",
- "double-redirect-fixed-maintenance": "تصليح تحويلة مزدوجة من [[$1]] إلى [[$2]].",
+ "double-redirect-fixed-move": "نُقلت [[$1]].\nحُدّثت تلقائيا وهي الآن تحويلة إلى [[$2]].",
+ "double-redirect-fixed-maintenance": "تصحيح تلقائي لتحويلة مزدوجة من [[$1]] إلى [[$2]] في مهمة صيانة.",
"double-redirect-fixer": "مصلح التحويل",
"brokenredirects": "تحويلات مكسورة",
"brokenredirectstext": "التحويلات التالية تصل لصفحات غير موجودة:",
"wantedtemplates": "قوالب مطلوبة",
"mostlinked": "أكثر الصفحات وصلا",
"mostlinkedcategories": "أكثر التصنيفات ارتباطا",
- "mostlinkedtemplates": "أكثر القوالب وصلا",
+ "mostlinkedtemplates": "أكثر الصفحات تضمينا",
"mostcategories": "أكثر الصفحات تصنيفا",
"mostimages": "أكثر الملفات ارتباطا",
"mostinterwikis": "الصفحات التي تحتوي على أغلب وصلات الإنترويكي",
"listgrouprights-removegroup-self": "يمكنه إزالة {{PLURAL:$2|المجموعة|المجموعات}} من حسابه الخاص: $1",
"listgrouprights-addgroup-self-all": "يمكنه إضافة كل المجموعات إلى حسابه الخاص",
"listgrouprights-removegroup-self-all": "يمكنه إزالة كل المجموعات من حسابه الخاص",
+ "listgrouprights-namespaceprotection-header": "قيود النطاق",
"listgrouprights-namespaceprotection-namespace": "النطاق",
+ "trackingcategories": "تصانيف التتبع",
+ "trackingcategories-summary": "تسرد هذه الصفحة تصانيف التتبع التي ينشئها برنامج ميدياويكي. يمكن تغيير أسمائها بتغيير رسائل النظام في نطاق {{ns:8}}.",
+ "trackingcategories-msg": "تصانيف التتبع",
"trackingcategories-name": "اسم الرسالة",
"trackingcategories-desc": "معايير إدراج تصنيف",
+ "noindex-category-desc": "هذه الصفحة لا تفهرسها الروبوتات لأن فيها الكلمة السحرية <code><nowiki>__NOINDEX__</nowiki></code> ولأنها في نطاق يسمح بهذا العلم.",
+ "index-category-desc": "الصفحة فيها <code><nowiki>__INDEX__</nowiki></code> (وهي في نطاق يسمح بهذا العلم) ولذا فالروبوتات تفهرسها بينما الأصل ألا تفعل.",
+ "post-expand-template-inclusion-category-desc": "بعد توسيع جميع القوالب حجم الصفحة أكبر من <code><nowiki>__INDEX__</nowiki></code> ولذا فبعض القوالب لا تُوسّع.",
+ "post-expand-template-argument-category-desc": "بعد توسيع معطى قالب (الموجود بين أقواس معقوفة ثلاثة مثل <code>{{{شيء}}}</code>) الصفحة أكبر من <code>$wgMaxArticleSize</code>.",
+ "expensive-parserfunction-category-desc": "دوال المعالجة المكلفة (مثل <code>#ifexist</code>) كثيرة جدا. راجع [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+ "broken-file-category-desc": "يضاف التصنيف إذا كانت الصفحة تحتوي وصلة معطوبة (وصلة لتضمين ملف والملف غير موجود)",
+ "hidden-category-category-desc": "التصنيف الذي فيه <code><nowiki>__HIDDENCAT__</nowiki></code> والذي يمنع مبدئيا عرضه في صندوق وصلات التصانيف في الصفحات.",
"trackingcategories-nodesc": "لا يتوفر وصف.",
"trackingcategories-disabled": "التصنيف غير مفعل",
"mailnologin": "لا يوجد عنوان للإرسال",
"movepagetalktext": "صفحة النقاش المرفقة سيتم نقلها كذلك، '''إلا في حالة''':\n* توجد صفحة نقاش غير فارغة تحت العنوان الجديد، أو\n* قمت بإزالة اختيار الصندوق بالأسفل.\n\nوفي هذه الحالات، يجب عليك نقل أو دمج محتويات الصفحة يدويا، إذا رغب في ذلك.",
"movearticle": "انقل الصفحة:",
"moveuserpage-warning": "'''تحذير: أنت على وشك نقل صفحة مستخدم. من فضلك لاحظ أن الصفحة وحدها سوف تنقل وأن المستخدم لن يعاد تسميته.'''",
- "movecategorypage-warning": "<strong>تحذير:</strong> أنت على وشك نقل صفحة تصنيف. نرجو التنبه إلى أن ذلك سينقل الصفحة فقط و<em>لن</em> يعاد تصنيف أي صفحة في التصنيف السابق إلى التصنيف الجديد.",
+ "movecategorypage-warning": "أنت على وشك نقل صفحة التصنيف إلى عنوان جديد؛ لن تنقل الصفحات المندرجة تحت التصنيف إلى العنوان الجديد.",
"movenologintext": "يجب أن تكون مستخدماً مسجلاً وأن [[Special:UserLogin|تسجل دخولك]] لكي تنقل صفحة.",
"movenotallowed": "أنت لا تمتلك الصلاحية لنقل الصفحات.",
"movenotallowedfile": "أنت لا تمتلك الصلاحية لنقل الملفات.",
"tooltip-preferences-save": "احفظ التغييرات",
"tooltip-summary": "أدخل ملخصا قصيرا",
"common.css": "/* ستؤثر الأنماط المتراصة (CSS) المعروضة هنا على كل الواجهات */",
- "monobook.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة مونوبوك */",
- "vector.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة فكتور */",
"print.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على ناتج الطباعة */",
"noscript.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على المستخدمين الذين الجافاسكريبت لديهم معطلة */",
"group-autoconfirmed.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على المستخدمين المؤكدين تلقائيا فقط */",
"group-sysop.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على الإداريين فقط */",
"group-bureaucrat.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على البيروقراطيين فقط */",
"common.js": "/* الجافاسكريبت الموضوع هنا سيتم تحميله لكل المستخدمين مع كل تحميل للصفحة. */",
- "monobook.js": "/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة مونوبوك */",
- "vector.js": "/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة فكتور */",
"group-autoconfirmed.js": "/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين المؤكدين تلقائيا فقط */",
"group-bot.js": "/* أي جافاسكريبت هنا سيتم تحميلها للبوتات فقط */",
"group-sysop.js": "/* أي جافاسكريبت هنا سيتم تحميلها للإداريين فقط */",
"pageinfo-category-pages": "عدد الصفحات",
"pageinfo-category-subcats": "عدد التصنيفات الفرعية",
"pageinfo-category-files": "عدد الملفات",
- "skinname-monobook": "مونوبوك",
- "skinname-vector": "فكتور",
"markaspatrolleddiff": "علم بعلامة المراجعة",
"markaspatrolledtext": "علم هذه الصفحة بعلامة المراجعة",
"markedaspatrolled": "علمت بعلامة المراجعة",
"qbmyoptions": "ܦܐܬܬ̈ܐ ܕܝܠܝ",
"faq": "ܫܘܐܠ̈ܐ ܬܢܝ̈ܐ",
"faqpage": "Project:ܫܘܐܠ̈ܐ ܬܢܝ̈ܐ",
- "vector-action-addsection": "ܐܘܣܦ ܡܠܘܐܐ",
- "vector-action-delete": "ܫܘܦ",
- "vector-action-move": "ܫܢܝ",
- "vector-action-protect": "ܛܪ",
- "vector-action-undelete": "ܠܐ ܫܘܦ",
- "vector-action-unprotect": "ܫܚܠܦ ܢܛܝܪܘܬܐ",
- "vector-view-create": "ܒܪܝ",
- "vector-view-edit": "ܫܚܠܦ",
- "vector-view-history": "ܚܙܝ ܬܫܥܝܬܐ",
- "vector-view-view": "ܩܪܝ",
- "vector-view-viewsource": "ܚܙܝ ܡܒܘܥܐ",
"actions": "ܥܒܕ̈ܐ",
"namespaces": "ܚܩܠܬ̈ܐ",
"variants": "ܡܫܬܚܠܦܢܘ̈ܬܐ",
"qbmyoptions": "صفحاتى",
"faq": "اسئله بتتسئل كتير",
"faqpage": "Project:اسئله بتتسئل كتير",
- "vector-action-addsection": "ضيف موضوع",
- "vector-action-delete": "مسح",
- "vector-action-move": "نقل",
- "vector-action-protect": "حمايه",
- "vector-action-undelete": "الغى المسح",
- "vector-action-unprotect": "غير الحمايه",
- "vector-view-create": "اعمل",
- "vector-view-edit": "تعديل",
- "vector-view-history": "استعراض التاريخ",
- "vector-view-view": "قرايه",
- "vector-view-viewsource": "استعراض المصدر",
"actions": "أعمال",
"namespaces": "النطاقات",
"variants": "المتغيرات",
"diff-multi-manyusers": "({{PLURAL:$1|نسخه واحده متوسطه|$1 نسخ متوسطه}} by {{PLURAL:$2|يوزر واحد |$2 يوزرات}} مش معروضه)",
"searchresults": "نتايج التدوير",
"searchresults-title": "نتايج التدوير على \"$1\"",
- "toomanymatches": "لقينا حاجات كتيرة متطابقة، لو سمحت تجرب استعلام مختلف",
"titlematches": "عنوان الصفحة زى",
"textmatches": "نص الصفحة بيطابق",
"notextmatches": "ما لقيناش أى نص مطابق",
"tooltip-summary": "اكتب ملخص قصير",
"interlanguage-link-title": "ل $1 – $2",
"common.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على كل الواجهات */",
- "monobook.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة مونوبوك */",
- "vector.css": "/* CSS اللى هنا حتأثر على اليوزرز اللى بيستخدموا واجهة فكتور */",
"print.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على ناتج الطباعة */",
"common.js": "/* أى جافاسكريبت هناح يتحمل لكل اليوزرز مع كل تحميل للصفحة. */",
- "monobook.js": "/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة مونوبوك */",
- "vector.js": "/* اى جافاسكريبت هنا حتتحمل لكل يوزر بيستخدم واجهة فكتور */",
"anonymous": "{{PLURAL:$1|يوزر مجهول|يوزرز مجهولين}} ل {{SITENAME}}",
"siteuser": "يوزر {{SITENAME}} $1",
"anonuser": "{{SITENAME}} يوزر مجهول $1",
"spam_reverting": "ترجيع آخر نسخة مافيهاش لينكات لـ $1",
"spam_blanking": "كل النسخ فيها لينكات ل $1، فضيها",
"simpleantispam-label": "اختبار انتي-سبام.\n'''ماتعبيش''' دا!",
- "skinname-monobook": "مونوبوك",
"markaspatrolleddiff": "علم عليها انها متراجعة",
"markaspatrolledtext": "علم على المقاله دى إنها متراجعة",
"markedaspatrolled": "اتعلم عليها متراجعة",
"qbmyoptions": "মোৰ পৃষ্ঠাসমূহ",
"faq": "সততে উদিত প্ৰশ্নসমূহ (FAQ)",
"faqpage": "Project:সততে উদিত প্ৰশ্নসমূহ",
- "vector-action-addsection": "বিষয় যোগ",
- "vector-action-delete": "বিলোপ কৰক",
- "vector-action-move": "স্থানান্তৰ কৰক",
- "vector-action-protect": "সুৰক্ষিত কৰক",
- "vector-action-undelete": "পুনৰুদ্ধাৰ কৰক",
- "vector-action-unprotect": "সুৰক্ষা সলনি কৰক",
- "vector-view-create": "সৃষ্টি কৰক",
- "vector-view-edit": "সম্পাদনা",
- "vector-view-history": "ইতিহাস চাওক",
- "vector-view-view": "পঢ়ক",
- "vector-view-viewsource": "উৎস চাওক",
"actions": "কাৰ্যসমূহ",
"namespaces": "নামস্থান",
"variants": "বিকল্পসমূহ",
"permalink": "স্থায়ী সূত্ৰ (লিংক)",
"print": "প্ৰিণ্ট কৰিবলৈ",
"view": "দেখুৱাওক",
+ "view-foreign": "$1-ত চাওক",
"edit": "সম্পাদনা",
+ "edit-local": "স্থানীয় বিৱৰণ সম্পাদনা কৰক",
"create": "সৃষ্টি কৰক",
+ "create-local": "স্থানীয় বিৱৰণ যোগ কৰক",
"editthispage": "এই পৃষ্ঠা সম্পাদনা কৰক",
"create-this-page": "এই পৃষ্ঠা সৃষ্টি কৰক",
"delete": "বিলোপ কৰক",
"jumptonavigation": "দিকদৰ্শন",
"jumptosearch": "সন্ধানাৰ্থে",
"view-pool-error": "দুঃখিত, এই মুহূৰ্তত চাৰ্ভাৰত অতিৰিক্ত চাপ পৰিছে ।\nঅজস্ৰ সদস্যই এই পৃষ্ঠা চাব বিচাৰিছে ।\nঅনুগ্ৰহ কৰি অলপ পাছত এই পৃষ্ঠা চাবলৈ প্ৰয়াস কৰক ।\n\n$1",
+ "generic-pool-error": "দুঃখিত, এই মুহূৰ্তত চাৰ্ভাৰত অতিৰিক্ত চাপ পৰিছে।\nঅজস্ৰ সদস্যই এই উৎস চাবলৈ বিচাৰিছে।\nঅনুগ্ৰহ কৰি অলপ পাছত এই উৎস চাবলৈ প্ৰয়াস কৰক।",
"pool-timeout": "বন্ধ কৰাৰ বাবে অপেক্ষা কৰাৰ সময় উকলি গৈছে",
"pool-queuefull": "পুল কিউ (pool queue) পূৰ্ণ",
"pool-errorunknown": "অপৰিচিত ত্ৰুটি",
"resetpass-abort-generic": "এটা এক্সটেন্ছনৰদ্বাৰা গুপ্তশব্দ সলনি কাৰ্য বাতিল কৰা হৈছে।",
"resetpass-expired": "আপোনাৰ গুপ্তশব্দৰ ম্যাদ উকলি গৈছে। অনুগ্ৰহ কৰি প্ৰৱেশৰ বাবে এটা নতুন গুপ্তশব্দ নিৰ্ধাৰণ কৰক।",
"resetpass-expired-soft": "আপোনাৰ গুপ্তশব্দৰ ম্যাদ উকলি গৈছে আৰু নতুন এটা নিৰ্ধাৰণ কৰাৰ প্ৰয়োজন। অনুগ্ৰহ কৰি এতিয়া এটা নতুন গুপ্তশব্দ বাছনি কৰক বা পিছত নিৰ্ধাৰণ কৰিবলৈ \"{{int:resetpass-submit-cancel}}\" বুটামত ক্লিক কৰক।",
+ "resetpass-validity-soft": "আপোনাৰ গুপ্তশব্দ বৈধ নহয়: $1\n\nঅনুগ্ৰহ কৰি এটা নতুন গুপ্তশব্দ বাছনি কৰক, বা ইয়াক পাছত সলাবলৈ \"{{int:resetpass-submit-cancel}}\" ক্লিক কৰক।",
"passwordreset": "গুপ্তশব্দ ন-কৈ বহুৱাওক",
"passwordreset-text-one": "আপোনাৰ গুপ্তশব্দ ন-কৈ বহুৱাবলৈ এই প্ৰপত্ৰ পূৰণ কৰক।",
"passwordreset-text-many": "{{PLURAL:$1|ইমেইলত এটা অস্থায়ী গুপ্তশব্দ পাবলৈ এই তথ্যসমূহৰ যিকোনো এটা দিয়ক।}}",
"edit-gone-missing": "পৃষ্ঠাটো নবীকৰণ কৰিব পৰা নগ’ল।\nসম্ভৱতঃ পৃষ্ঠাখন বিলোপ কৰা হৈছে।",
"edit-conflict": "সম্পাদনা দ্বন্দ্ব।",
"edit-no-change": "আপোনাৰ সম্পাদনা আওকাণ কৰা হৈছে, কাৰণ লেখাত কোনো তফাৎ নাই।",
+ "postedit-confirmation-created": "পৃষ্ঠাটো সৃষ্টি কৰা হৈছে।",
+ "postedit-confirmation-restored": "পৃষ্ঠাটো পুনৰুদ্ধাৰ কৰা হৈছে।",
"postedit-confirmation-saved": "আপোনাৰ সম্পাদনা সাঁচি থোৱা হ'ল।",
"edit-already-exists": "নতুন পৃষ্ঠা সৃষ্টি কৰা নহ'ল।\nপৃষ্ঠাটো ইতিমধ্যে আছেই।",
"defaultmessagetext": "সাধাৰণ বাৰ্তা পাঠ্য",
"content-failed-to-parse": "$1 মডেলৰ বাবে $2ৰ তথ্য নিকা কৰিব পৰা নগ’ল: $3",
"invalid-content-data": "অবৈধ সমল তথ্য",
"content-not-allowed-here": "[[$2]] পৃষ্ঠাত \"$1\" সমল অনুমোদিত নহয়",
- "editwarning-warning": "à¦\8fà¦\87 পà§\83ষà§\8dঠাà¦\9fà§\8b à¦\8fৰিলà§\87 à¦\86পà§\81নি à¦\95ৰা পৰিবৰà§\8dতনসমà§\82হ হà§\87ৰাব পাৰà§\87। যদি à¦\86পà§\81নি পà§\8dৰৱà§\87শ à¦\95ৰা à¦\85ৱসà§\8dথাত à¦\86à¦\9bà§\87, à¦\86পà§\81নি à¦\8fà¦\87 সতৰà§\8dà¦\95বাৰà§\8dতাà¦\95 à¦\86পà§\8bনাৰ পà¦\9bনà§\8dদসমà§\82হৰ \"সমà§\8dপাদনা\" à¦\85à¦\82শত à¦\85সামৰà§\8dথবান কৰিব পাৰিব।",
+ "editwarning-warning": "à¦\8fà¦\87 পà§\83ষà§\8dঠাà¦\9fà§\8b à¦\8fৰিলà§\87 à¦\86পà§\81নি à¦\95ৰা পৰিৱতনসমà§\82হ হà§\87ৰাà¦\87 যাব পাৰà§\87।\nযদি à¦\86পà§\81নি লà¦\97à§\8dâ\80\8c à¦\87ন à¦\95ৰি à¦\86à¦\9bà§\87, à¦\86পà§\81নি à¦\8fà¦\87 সতৰà§\8dà¦\95বাণà§\80à¦\95 à¦\86পà§\8bনাৰ পà¦\9bনà§\8dদসমà§\82হৰ \"{{int:prefs-editing}}\" à¦\85à¦\82শত নিষà§\8dà¦\95à§\8dৰিয় কৰিব পাৰিব।",
"editpage-notsupportedcontentformat-title": "সমলৰ ফৰ্মেট সমৰ্থিত নহয়।",
"editpage-notsupportedcontentformat-text": "সমল মডেল $2ৱে সমল ফৰ্মেট $1 সমৰ্থন নকৰে।",
"content-model-wikitext": "ৱিকিপাঠ্য",
"undo-success": "এই সম্পাদনা পূৰ্ববৎ কৰিব পাৰি ।\nঅনুগ্ৰহ কৰি তলৰ তুলনাটি পৰীক্ষা কৰি ঠাৱৰ কৰক যে আপুনি এনে কৰিব বিচাৰিছে, আৰু তলত সালসলনিসমূহ সাঁচি এই কাৰ্য্য সম্পন্ন কৰক ।",
"undo-failure": "এই সম্পাদনা মধ্যৱৰ্তী সম্পাদনাসমূহৰ দ্বন্দৰ কাৰণে পূৰ্ববৎ কৰা নহ'ব ।",
"undo-norev": "এই সম্পাদনাটি ৰদ কৰিব নোৱাৰি, কাৰণ ই আৰু নাই বা ইয়াক বাতিল কৰা হ'ল ।",
+ "undo-nochange": "সম্পাদনাটো ইতিমধ্যেই বাতিল কৰা হৈছে।",
"undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|আলোচনা]]) সম্পাদিত $1 সংশোধনটি বাতিল কৰক",
"undo-summary-username-hidden": "এজন গোপন ব্যৱহাৰকাৰীয়ে কৰা $1 সংশোধন বাতিল কৰক",
"cantcreateaccounttitle": "একাউণ্ট সৃষ্টি কৰিব নোৱাৰি",
"currentrev": "শেহতীয়া সংস্কৰণ",
"currentrev-asof": "$1 অনুযায়ী বৰ্তমান সংস্কৰণ",
"revisionasof": "$1ৰ সংস্কৰণ",
- "revision-info": "$1-লà§\88 $2à¦\87 à¦\95ৰা সà¦\82শà§\8bধন",
+ "revision-info": "$1-ত {{GENDER:$6|$2}} সদসà§\8dযâ\80\8cà¦\87 à¦\95ৰা সà¦\82শà§\8bধন$7",
"previousrevision": "← আগৰ সংশোধন",
"nextrevision": "নতুন সংশোধন→",
"currentrevisionlink": "শেহতীয়া সংশোধন",
"difference-missing-revision": "{{PLURAL:$2|এটা সংস্কৰণ|$2 সংস্কৰণসমূহৰ}} সংশোধনৰ পাৰ্থক্য ($1) {{PLURAL:$2| পোৱা নগ’ল}}।\n\n\nসাধাৰণতে বিলোপ কৰা এখন পৃষ্ঠাৰ পুৰণা ইতিহাস লিংক অনুসৰণ কৰিলে এনে হয়।\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} বিলোপন অভিলেখ] চালে অধিক তথ্য পাব।",
"searchresults": "অনুসন্ধানৰ ফলাফল",
"searchresults-title": "\"$1\" অনুসন্ধানৰ ফলাফল",
- "toomanymatches": "বহুত বেছি মিল পোৱা গৈছে, সন্ধান-শব্দ সলনি কৰিবলৈ অনুৰোধ কৰা হ'ল",
"titlematches": "পৃষ্ঠাৰ শিৰোনামা মিলিছে",
"textmatches": "পৃষ্ঠাৰ পাঠ মিলিছে",
"notextmatches": "কোনো পৃষ্ঠাৰ পাঠ মিলা নাই",
"powersearch-togglelabel": "পৰীক্ষা কৰক:",
"powersearch-toggleall": "সকলো",
"powersearch-togglenone": "একো নাই",
+ "powersearch-remember": "ভৱিষ্যতৰ সন্ধানৰ বাবে বাছনি মনত ৰাখক।",
"search-external": "বাহ্যিক সন্ধান",
"searchdisabled": "{{SITENAME}} ত অনুসন্ধান কৰা সাময়িক ভাবে নিষ্ক্ৰিয় কৰা হৈছে।\nতেতিয়ালৈকে গুগলত অনুসন্ধান কৰক।\nমনত ৰাখিব যে তেঁওলোকৰ {{SITENAME}}ৰ ইণ্ডেক্স পুৰণি হব পাৰে।",
"search-error": "অনুসন্ধানৰ সময়ত এটা ত্ৰুটি হৈছে: $1",
"right-move": "পৃষ্ঠাসমূহ স্থানান্তৰ কৰক",
"right-move-subpages": "পৃষ্ঠাৰ সৈতে উপ-পৃষ্ঠাসমূহও স্থানান্তৰ কৰক",
"right-move-rootuserpages": "ৰুট সদস্যৰ পৃষ্ঠাসমূহ স্থানান্তৰ কৰক",
+ "right-move-categorypages": "শ্ৰেণী পৃষ্ঠাসমূহ স্থানান্তৰ কৰক",
"right-movefile": "ফাইল স্থানান্তৰ কৰক",
"right-suppressredirect": "পৃষ্ঠা স্থানান্তৰ কৰোঁতে উৎস পৃষ্ঠাৰ পৰা পুনঃনিৰ্দেশনা সৃষ্টি কৰিব নালাগে",
"right-upload": "ফাইল আপল'ড কৰক",
"action-createpage": "পৃষ্ঠা সৃষ্টি কৰক",
"action-createtalk": "কথাবতৰা পৃষ্ঠা সৃষ্টি কৰক",
"action-createaccount": "এই সদস্য একাউণ্ট সৃষ্টি কৰক",
+ "action-history": "এই পৃষ্ঠাৰ ইতিহাস চাওক",
"action-minoredit": "সম্পাদনা অগুৰুত্বপূৰ্ণ বুলি চিহ্নিত কৰক",
"action-move": "এই পৃষ্ঠা স্থানান্তৰ কৰক",
"action-move-subpages": "এই পৃষ্ঠা আৰু ইয়াৰ উপপৃষ্ঠাসমূহ আঁতৰাওক",
"action-move-rootuserpages": "ৰুট সদস্যৰ পৃষ্ঠাসমূহ স্থানান্তৰ কৰক",
+ "action-move-categorypages": "শ্ৰেণী পৃষ্ঠাসমূহ স্থানান্তৰ কৰক",
"action-movefile": "এই ফাইল স্থানান্তৰ কৰক",
"action-upload": "এই ফাইল আপল'ড কৰক",
"action-reupload": "বৰ্তমান থকা ফাইলৰ ওপৰত লিখক",
"protectedpages-cascade": "কেৱল প্ৰপাতাকাৰ সুৰক্ষা",
"protectedpages-noredirect": "পুনঃনিৰ্দেশ লুকুৱাওক",
"protectedpagesempty": "এই পাৰামিটাৰবোৰেৰে কোনো পৃষ্ঠা এতিয়া সুৰক্ষিত কৰা হোৱা নাই ।",
+ "protectedpages-timestamp": "সময়-মোহৰ",
"protectedpages-page": "পৃষ্ঠা",
"protectedpages-expiry": "ম্যাদ উকলিব",
+ "protectedpages-params": "সুৰক্ষা পাৰামিটাৰসমূহ",
+ "protectedpages-reason": "কাৰণ",
+ "protectedpages-unknown-timestamp": "অজ্ঞাত",
+ "protectedpages-unknown-performer": "অজ্ঞাত ব্যৱহাৰকাৰী",
"protectedtitles": "সুৰক্ষিত শিৰোনামাসমূহ",
"protectedtitlesempty": "এই পাৰামিটাৰবোৰেৰে কোনো শিৰোনামা এতিয়া সুৰক্ষিত কৰা হোৱা নাই ।",
"listusers": "সদস্য তালিকা",
"listgrouprights-removegroup-self": "{{PLURAL:$2|গোট|গোটসমূহ}} নিজৰ একাউণ্টৰপৰা আঁতৰাওক: $1",
"listgrouprights-addgroup-self-all": "সকলো গোট নিজৰ একাউণ্টত যোগ কৰক",
"listgrouprights-removegroup-self-all": "নিজৰ একাউণ্টৰপৰা সকলো গোট আঁতৰাওক",
+ "listgrouprights-namespaceprotection-header": "নামস্থান নিষেধাজ্ঞাসমূহ",
+ "listgrouprights-namespaceprotection-namespace": "নামস্থান",
+ "trackingcategories-nodesc": "কোনো বিৱৰণ উপলব্ধ নহয়।",
+ "trackingcategories-disabled": "শ্ৰেণী নিষ্ক্ৰিয় হৈ আছে",
"mailnologin": "পাওঁতাৰ ঠিকনা নাই",
"mailnologintext": "আন সদস্যক ই-মেইল পঠিয়াবলৈ আপুনি [[Special:UserLogin|লগ্ ইন]] কৰিব লাগিব আৰু আপোনাৰ [[Special:Preferences|পছন্দসমূহত]] এটা বৈধ ই-মেইল ঠিকনা থাকিব লাগিব ।",
"emailuser": "এই সদস্যজনলৈ ই-মেইল পঠিয়াওক",
"watchnologin": "প্ৰৱেশ কৰা নাই",
"addwatch": "লক্ষ্য-তালিকাত অন্তৰ্ভুক্ত কৰক",
"addedwatchtext": "আপোনাৰ [[Special:Watchlist|লক্ষ্য তালিকাত ]] \"[[:$1]]\" পৃষ্ঠাটো অন্তৰ্ভুক্ত কৰা হ'ল।\nভৱিষ্যতে এই পৃষ্ঠা বা ইয়াৰ আলোচনা পৃষ্ঠাত হোৱা সাল-সলনি আপুনি আপোনাৰ লক্ষ্য তালিকাত দেখিব।",
+ "addedwatchtext-short": " \"$1\" পৃষ্ঠাটো আপোনাৰ লক্ষ্য-তালিকাত যোগ কৰা হৈছে।",
"removewatch": "লক্ষ্য-তালিকাৰ পৰা আঁতৰাওক",
"removedwatchtext": "\"[[:$1]]\" পৃষ্ঠাটো [[Special:Watchlist|আপোনাৰ লক্ষ্য-তালিকা]]ৰ পৰা আঁতৰোৱা হৈছে ।",
+ "removedwatchtext-short": "\"$1\" পৃষ্ঠাটো আপোনাৰ লক্ষ্য-তালিকাৰ পৰা আঁতৰোৱা হৈছে।",
"watch": "চকু ৰাখক",
"watchthispage": "এই পৃষ্ঠাটো লক্ষ্য কৰক",
"unwatch": "চকু দিব নালাগে",
"unwatchthispage": "চকু দিয়া বন্ধ কৰক",
"notanarticle": "সমল পৃষ্ঠা নহয়",
"notvisiblerev": "অন্য কোনো সদস্যই কৰা সংশোধনী বিলোপ কৰা হৈছে",
- "watchlist-details": "à¦\86লà§\8bà¦\9aনা পà§\83ষà§\8dঠাসমà§\82হ লà§\87à¦\96ত নধৰি {{PLURAL:$1|$1 à¦\9fা পà§\83ষà§\8dঠা}} à¦\86পà§\8bনাৰ লà¦\95à§\8dষà§\8dয-তালিà¦\95াত à¦\86à¦\9bà§\87 ।",
+ "watchlist-details": "à¦\86লà§\8bà¦\9aনা পà§\83ষà§\8dঠাসমà§\82হ বà§\87লà§\87à¦\97à¦\95à§\88 লà§\87à¦\96ত নধৰি {{PLURAL:$1|$1 à¦\9fা পà§\83ষà§\8dঠা}} à¦\86পà§\8bনাৰ লà¦\95à§\8dষà§\8dয-তালিà¦\95াত à¦\86à¦\9bà§\87।",
"wlheader-enotif": "ইমেইল জাননী সক্ৰিয় কৰা হৈছে।",
"wlheader-showupdated": "আপোনাৰ শেষ পৰিদৰ্শনৰ পিছত সলনি হোৱা পৃষ্ঠাসমূহ '''গাঢ়''' আখৰত দেখুওৱা হৈছে।",
+ "wlnote2": "$2, $3 অনুসাৰে শেষ {{PLURAL:$1|ঘণ্টাৰ|<strong>$1</strong> ঘণ্টাৰ}} সালসলনি তলত দিয়া হৈছে।",
"wlshowlast": "যোৱা $1 ঘণ্টা $2 দিন $3 চাওক",
"watchlist-options": "লক্ষ্য-তালিকা পছন্দসমূহ",
"watching": "চকু দিয়া হৈছে.....",
"watchlistedit-raw-done": "আপোনাৰ লক্ষ্য-তালিকা নবীকৰণ কৰা হ'ল",
"watchlistedit-raw-added": "{{PLURAL:$1|এটা শিৰোনামা|$1-টা শিৰোনামা}} যোগ কৰা হ'ল:",
"watchlistedit-raw-removed": "{{PLURAL:$1|এটা শিৰোনামা|$1-টা শিৰোনামা}} আঁতৰোৱা হ'ল:",
+ "watchlistedit-clear-title": "লক্ষ্য-তালিকা পৰিষ্কাৰ কৰা হ'ল",
+ "watchlistedit-clear-legend": "লক্ষ্য-তালিকা পৰিষ্কাৰ কৰক",
+ "watchlistedit-clear-explain": "সকলো শিৰোনামা আপোনাৰ লক্ষ্য-তালিকাৰ পৰা আঁতৰোৱা হ'ব",
+ "watchlistedit-clear-titles": "শিৰোনামাসমূহ:",
+ "watchlistedit-clear-submit": "লক্ষ্য-তালিকা পৰিষ্কাৰ কৰক (এইটো স্থায়ী!)",
+ "watchlistedit-clear-done": "আপোনাৰ লক্ষ্য-তালিকা পৰিষ্কাৰ কৰা হ'ল।",
"watchlisttools-view": "সংগতি থকা সাল-সলনিবোৰ চাওক",
"watchlisttools-edit": "লক্ষ্য-তালিকা চাওক আৰু সম্পাদনা কৰক",
"watchlisttools-raw": "অশোধিত লক্ষ্য-তালিকা সম্পাদনা কৰক",
"htmlform-no": "নহয়",
"htmlform-yes": "হয়",
"htmlform-chosen-placeholder": "এটা বিকল্প বাছনি কৰক",
+ "htmlform-cloner-create": "আৰু যোগ কৰক",
+ "htmlform-cloner-delete": "আঁতৰাওক",
"sqlite-has-fts": "$1 সম্পূৰ্ণ-পাঠ অনুসন্ধান সমৰ্থন সহ",
"sqlite-no-fts": "$1 সম্পূৰ্ণ-পাঠ অনুসন্ধান সমৰ্থন অবিহনে",
"logentry-delete-delete": "$3 পৃষ্ঠাটো $1ৰদ্বাৰা {{GENDER:$2|বিলোপ কৰা হ'ল}}",
"qbmyoptions": "Les mios páxines",
"faq": "EMF (entrugues más frecuentes)",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Amestar seición",
- "vector-action-delete": "Desaniciar",
- "vector-action-move": "Treslladar",
- "vector-action-protect": "Protexer",
- "vector-action-undelete": "Restaurar",
- "vector-action-unprotect": "Camudar la proteición",
- "vector-view-create": "Crear",
- "vector-view-edit": "Editar",
- "vector-view-history": "Ver historial",
- "vector-view-view": "Lleer",
- "vector-view-viewsource": "Ver fonte",
"actions": "Aiciones",
"namespaces": "Espacios de nome",
"variants": "Variantes",
"difference-missing-revision": "{{PLURAL:$2|Nun s'alcontró|Nun s'alcontraron}} {{PLURAL:$2|una revisión|$2 revisiones}} d'esta diferencia ($1).\n\nDe vezu la causa d'esto ye siguir un enllaz de diferencia antiguu a una páxina que se desanició.\nSe puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistru de desanicios].",
"searchresults": "Resultaos de la busca",
"searchresults-title": "Resultaos de buscar \"$1\"",
- "toomanymatches": "Atopáronse demasiaes coincidencies, por favor fai una consulta diferente",
"titlematches": "Coincidencies de los títulos de la páxina",
"textmatches": "Coincidencies del testu de la páxina",
"notextmatches": "Nun hai coincidencies nel testu de la páxina",
"tooltip-summary": "Escribi un resume curtiu",
"interlanguage-link-title": "$1 – $2",
"common.css": "/* Los CSS allugaos equí s'aplicarán a tolos aspeutos */",
- "monobook.css": "/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Monobook */",
- "vector.css": "/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Vector */",
"print.css": "/* Los CSS allugaos equí afeutarán a la salida pola imprentadora */",
"noscript.css": "/* Los CSS allugaos equí afeutarán a los usuarios col JavaScript desactiváu */",
"group-autoconfirmed.css": "/* Los CSS allugaos equí afeutarán a los usuarios autoconfirmaos namái */",
"group-sysop.css": "/* Los CSS allugaos equí afeutarán a los sysops namái */",
"group-bureaucrat.css": "/* Los CSS allugaos equí afeutarán a los burócrates namái */",
"common.js": "/* Cualesquier JavaScript que tea equí se cargará pa tolos usuarios en cada carga de páxina. */",
- "monobook.js": "/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu MonoBook */",
- "vector.js": "/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Vector */",
"group-autoconfirmed.js": "/* Cualesquier JavaScript que tea equí se cargará pa los usuarios autoconfirmaos namái */",
"group-bot.js": "/* Cualesquier JavaScript que tea equí se cargará pa los bots namái */",
"group-sysop.js": "/* Cualesquier JavaScript que tea equí se cargará pa los sysops namái */",
"diff-multi-manyusers": "({{PLURAL:$2|Bir istifadəçi|$2 istifadəçi}} tərəfindən edilən {{PLURAL:$1|bir ara redaktə|$1 ara redaktə}} göstərilmir)",
"searchresults": "Axtarış nəticələri",
"searchresults-title": "''$1'' üçün axtarış nəticələri",
- "toomanymatches": "Üst-üstə düşən çoxlu hal tapılıb, lütfən yeni sorğu göndərin",
"titlematches": "Səhifə adı eynidir",
"textmatches": "Mətn eynidir",
"notextmatches": "Məqalələrdə uyğun məzmun tapılmadı",
"qbmyoptions": "صحیفهلریم",
"faq": "چوْخ سوْروشولان سوْاللار",
"faqpage": "Project:چوْخ سوْروشولان سوْاللار",
- "vector-action-addsection": "قوْنو آرتیر",
- "vector-action-delete": "سیل",
- "vector-action-move": "داشی",
- "vector-action-protect": "قوْرو",
- "vector-action-undelete": "سیلمگی قایتار",
- "vector-action-unprotect": "قوْروماغی دَییشدیر",
- "vector-view-create": "یارات",
- "vector-view-edit": "دَییشدیر",
- "vector-view-history": "گئچمیشه باخ",
- "vector-view-view": "اوْخو",
- "vector-view-viewsource": "قایناغا باخ",
"actions": "چالیشمالار",
"namespaces": "آد فضالاری",
"variants": "واریانتلار",
"difference-missing-revision": "بو فرقین ($1) {{PLURAL:$2|بیر|$2}} نوسخهسی تاپیلانمادی.\n\nعموماً بو خطا، سیلینن بیر صحیفهیه واختی گئچمیش بیر فرق باغلانتیسیلا گلمک ایله آرا گلر.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}سیلمک سیاهیسی]ندا باشقا بیلگیلر اولا بیلر.",
"searchresults": "آختاریش سونوجلاری",
"searchresults-title": "«$1» اوچون آختاریش نتیجهلری",
- "toomanymatches": "چوخلو سونوچلار تاپیلدی، لوطفاً باشقا بیر سورغویلا چالیشین.",
"titlematches": "صحیفه آدی عینیدیر",
"textmatches": "یازی عینیدیر",
"notextmatches": "هئچ بیر بنزر صحیفه یازیسی تاپیلمادی",
"qbmyoptions": "منی صفحات",
"faq": "ب.ج.س",
"faqpage": "Project:ب.ج.س",
- "vector-action-addsection": "هور کتن عنوان",
- "vector-action-delete": "زورگ",
- "vector-action-move": "جاه په جاه",
- "vector-action-protect": "حفاظت",
- "vector-action-undelete": "ترینگ",
- "vector-action-unprotect": "پروتکشنء ٹگل بدئ",
- "vector-view-create": "شرکتن",
- "vector-view-edit": "اصلاح",
- "vector-view-history": "چارتن تاریح",
- "vector-view-view": "وانتن",
- "vector-view-viewsource": "پیشدارگ بن جاه",
"actions": "کاران",
- "vector-more-actions": "گیشتر",
"namespaces": "فضانامان",
"variants": "گوشگان",
"navigation-heading": "منوء ناویگ",
"cascadeprotected": "ای صفحه محافظت بیت چه اصلاح چرا که آیی شامل جهلیگین {{PLURAL:$1|صفحه, که|صفحات, که}} محافظتی گون the \"cascading\" option turned on:\n$2",
"namespaceprotected": "شما اجازت په اصلاح صفحات ته '''$1'' نام فضا نیست",
"customcssprotected": "شما ائ پیجء سی اس اسء اصلاح کتنء اجازتء نداریت، پرچا که آئی توکا وتیگین تنظیمان چه ادگر کاربرء انت.",
+ "customjsprotected": "شما رء ائ جاوا اسکریپتین پیجء اصلاح کتنء اجازتء نه انت، پرچا که آئی توکا وتیگین تنظیمان چه ادگر کاربرء انت.",
+ "mycustomcssprotected": "شما رء اجازت پر ائ سی اس اسین پیجء اصلاح کتن نه انت.",
+ "mycustomjsprotected": "شما رء ائ جاوا اسکریپتین پیجء اصلاح کتنء اجازتء نه انت.",
+ "myprivateinfoprotected": "شما رء اجازت پر وتیگین اینفارمیشنء اصلاح کتنء نه انت.",
+ "mypreferencesprotected": "شما رء اجازت پر وتی تنظیماتء اصلاح کتنء نه انت.",
"ns-specialprotected": "حاصین صفحات اصلاح نه بنت",
"titleprotected": "ای عنوان محافظت بوتت چه سربیگ به وسیله [[User:$1|$1]].\nای دلیل دییگ بیتت ''$2''.",
+ "filereadonlyerror": "ائ فایل ٹگل «$1» بیت نکنت پرچا که ائ فایلء مهزن «$2» مان تهناوانتنیء حالت ایر انت.\n\nهما ماسٹر که آئرا کبل کتگ چوشین توضیحئ درشان کتگ: «$3».",
+ "invalidtitle-knownnamespace": "نامهتبرین عنوان گون نامء جاگاه «$2» ءُ تکست «$3»",
+ "invalidtitle-unknownnamespace": "نامهتبرین نام گون ناشناسین نامء جاگاه نمبر $1 ءُ تکست «$2»",
+ "exception-nologin": "مان نبیتگ ات",
+ "exception-nologin-text": "دزبندی انت سیستمء تها [[Special:Userlogin|مان بئیت]] تانکه بتوان ات ائ تاکء بگند ات.",
+ "exception-nologin-text-manual": "دزبندی انت $1 تانکه شمارء پر ائ تاک یانکه اکشنء دزرس ببیت انت.",
"virus-badscanner": "تنظیم بد: ناشناسین اسکنر ویروس: ''$1''",
"virus-scanfailed": "اسکن پروش وارت(کد $1)",
"virus-unknownscanner": "ناشناسین آنتی ویروس:",
- "logouttext": "''' شما الان در بوتت.'''\n\nشما تونیت چه {{SITENAME}} ناشناس استفاده کنیت یا شما تونیت دگه وراد بیت گون دگه یا هما کاربر.\nتوجه بیت که لهتی صفحات شاید په داب هما وهدی که شما وراد بوتتیت پیش درگ بند تا وهدی که ذخیره بروزر وتی پاک کنیت.",
+ "logouttext": "''' شما انیگء در شُت ات'''\nبزان که تانکه شمئی بروزرء چیرداتگین هافظه پهک مبیت، لهتئ چه تاکان ممکن انت رندا هم هنچوش پیش دارگ ببنت که انگار شما لاگین کتگ ات.",
+ "welcomeuser": "وشاتک ات $1!",
+ "welcomecreation-msg": "انیگء شمئی اکانت اڈ بیتگ انت.\nمشموش ات که وتی [[Special:Preferences|ترجیحات {{SITENAME}}]] رء ٹگل دئیت.",
"yourname": "نام کاربری",
+ "userlogin-yourname": "اکانتء نام",
+ "userlogin-yourname-ph": "وتی یوزرنامء بلک ات",
+ "createacct-another-username-ph": "وتی یوزرنامء بلک ات",
"yourpassword": "کلمه رمز",
+ "userlogin-yourpassword": "پسورد",
+ "userlogin-yourpassword-ph": "وتی پسوردء بلک ات",
+ "createacct-yourpassword-ph": "یک پسوردء بلک ات",
"yourpasswordagain": "کلمه رمز دگه نویس",
+ "createacct-yourpasswordagain": "چه دوبارگ پسوردء بلک ات",
+ "createacct-yourpasswordagain-ph": "چه دوبارگ پسوردء بلک ات",
"remembermypassword": "می ورودءَ ته ای کامپیوتر بدار (په $1 {{PLURAL:$1|روچ|روچ}})",
+ "userlogin-remembermypassword": "منء همک وهد برجاه بدار",
+ "userlogin-signwithsecure": "چه ایمنین کنکشنء کارمرز بکن ات",
"yourdomainname": "شمی دامین",
+ "password-change-forbidden": "شما نتوان ات پسوردان مان ائ ویکیء رء ٹگل دئیت.",
"externaldberror": "یک حطا دیتابیس تصدیق هویت دراییگی هست یا شما را اجازت نیست وتی حساب درایی په روچ کنیت.",
"login": "ورود",
"nav-login-createaccount": "ورود/شرکتن حساب",
"loginprompt": "شما بایدن په وارد بیگ ته {{SITENAME}} کوکی فعال کنیت",
"userlogin": "ورود/شرکتن حساب",
+ "userloginnocreate": "لاگین",
"logout": "در بیگ",
"userlogout": "در بیگ",
"notloggedin": "وارد نهت",
+ "userlogin-noaccount": "شما رء اکانت نه انت؟",
+ "userlogin-joinproject": "مان {{SITENAME}} ناملکی بکن ات!",
"nologin": "حسابء نیستن؟ '''$1'''.",
"nologinlink": "شرکتن یک حساب",
"createaccount": "حساب شرکن",
"gotaccount": "یک حساب الان هست؟'''$1'''.",
"gotaccountlink": "ورود",
- "createaccountmail": "گون ایمیل",
+ "userlogin-resetlink": "وتی لاگینء جزئیاتء رء شموش کتگ ات؟",
+ "userlogin-resetpassword-link": "وتی پسوردء رء شموش کتگ ات؟",
+ "userlogin-helplink2": "کمک گون لاگین",
+ "userlogin-loggedin": "شما انیگء {{GENDER:$1|$1}}ء حالتء مان بیتگ ات.\nچه جهلیگین فرم پر لاگین مان ادگر کاربرء حالتء کارمرز بکن ات.",
+ "userlogin-createanother": "ادگر اکانتء اڈ بکن ات",
+ "createacct-emailrequired": "ایمیل",
+ "createacct-emailoptional": "ایمیل (ایهتیاری)",
+ "createacct-email-ph": "وتی ایمیلء بلک ات",
+ "createacct-another-email-ph": "ایمیلء ادرسء بلک ات",
+ "createaccountmail": "کارمرز چه وتکارین موقتین پسورد ءُ رندا آئی دیم داتن پر مالومین ایمیل",
+ "createacct-realname": "شمئی اصلیگین نام (ایهتیاری)",
+ "createacct-reason-ph": "پرچا شما ادگر نوکین اکانتء اڈ کن ات",
+ "createacct-captcha": "سکیوریتی چک",
+ "createacct-imgcaptcha-ph": "برزین سیاهگء ادان بلک ات",
+ "createacct-submit": "وتی اکانتء اڈ کن ات",
+ "createacct-another-submit": "ادگر اکانتء اڈ بکن ات",
+ "createacct-benefit-heading": "{{SITENAME}} شهسانی واسته هنچوش که شمئیء اڈ بیتگ",
+ "createacct-benefit-body1": "$1 {{PLURAL:$1|اصلاح|اصلاح کتگان}}",
+ "createacct-benefit-body2": "{{PLURAL:$1|تاک|تاکان}}",
+ "createacct-benefit-body3": "{{PLURAL:$1|هوار بیتگ}} نوکین",
"badretype": "کلماتی رمزی که شما وارد کتگیت یک نهنت.",
- "userexists": "وارد بیتگیت نام کاربری الان استفاده بیت.\nلطفا دگه دابین نامی بزوریت.",
+ "userexists": "ائ یوزرنامء که لکتگ ات پیسریگء کارمرز بیتگ انت.\nدزبندی انت ادگر نامء بزیریت.",
"loginerror": "حطا ورود",
+ "createacct-error": "ارور مان اکانتء اڈ کنگء",
+ "createaccounterror": "پر ائ اکانتء اڈ کتن امکان نه انت: $1",
"nocookiesnew": "حساب کاربر شر بوت بله شما وارد نه بیتگیت ته.\n{{SITENAME}} چه کوکی په ورود کابران استفاده کنت.\nشما کوکی غیر فعال کتت.\nلطفا آییآ فعال کنیت رندا گون وتی نوکین نام کاربری و کلمه رمز وارد بیت.",
"nocookieslogin": "{{SITENAME}} په ورود کابران چه کوکی استفاده کنت.\nشمی کوکی غیر فعالنت.\nلطفا آییا فعال کنیت و دگه سعی کنیت.",
+ "nocookiesfornew": "اکانت اڈ نبیت، پرچا که ما نتوانت آئی منبعء رء تأیید کنین.\nپکا بزان ات که کوکیهان فعال انت، رندا پیجء چه نوک رلود کن ات و دوبارگ بچکاس ات.",
"noname": "شما یک معتبرین نام کاربر مشخص نه کتت.",
"loginsuccesstitle": "ورود موفقیت آمیز",
"loginsuccess": "''''شما الان وارد {{SITENAME}} په عنوان \"$1\".'''",
"nosuchuser": "هچ کاربری گون نام \"$1\" نیستن.\nکاربری نام حرفش په هور و مزنی حساس انت.\nوتی املايا چک کنیت یا [[Special:UserLogin/signup|نوکین حسابی شرکنیت]].",
"nosuchusershort": "هچ کاربری گون نام \"$1\"نیستن.\nوتی املايا کنترل کنیت",
"nouserspecified": "شما باید یک نام کاربری مشخص کنیت.",
+ "login-userblocked": "ائ کابر بلاک بیتگ. لاگین مان سیستمء اجازت نه انت.",
"wrongpassword": "اشتباهین کلمه رمز وارد بوت. دگه سعی کن.",
"wrongpasswordempty": "کلمه رمز وارد بیتگین هالیکنت. دگه سعی کن",
- "passwordtooshort": "شمی کلمه رمز نامعتبر یا باز هوردنت.\nآیی بایدن حداقل {{PLURAL:$1|1 کاراکتر|$1 کاراکتر}} کاراکتر بیت و چه نام کاربری متفاوت بیت.",
- "mailmypassword": "نوکین کلمه رمزء ایمیل کن",
+ "passwordtooshort": "پسورد ضرورانت چکم {{PLURAL:$1|۱ کرکتر|$1 کرکتر}} داشتگ بیت.",
+ "password-name-match": "شمئی پسورد ضرورنت چه شمئی یوزرنامء پرک بیت انت.",
+ "password-login-forbidden": "ائ یوزرنام ءُ پسوردء کارمرز اجازت نه انت.",
+ "mailmypassword": "نوکین پسوردء بلوٹ",
"passwordremindertitle": "نوکین هنگین کلمه رمز په {{SITENAME}}",
"passwordremindertext": "یک نفری(شاید شما، چه آی پی $1)\nلوٹتگی که ما شما را یک نوکین کلمه رمز دیم دهین په {{SITENAME}} ($4).\nکلمه رمز په کاربر \"$2\" الان شینت\"$3\".\nشما بایدن وارد بیت و وتی کلمه رمزآ بدل کنیت انو.\nشمی موقتین کلمه رمز دا {{PLURAL:$5|یک روچ|$5 روچ}} هلیت\n\nاگه دگه کسی په شما ای درخواست دیم داته و یا شما وتی کلمه رمزآ خاطر داریت و نه لوٹتیت آیآ عوض کنیت، شما تونیت این کوله یا شموشیت و گون هما قدیمی کلمه رمز ادامه دهیت",
"noemail": "هچ آدرس ایمیلی په کاربر \"$1\" ثبت نه بیتت.",
+ "noemailcreate": "پیکن یک مهتبرین ایمیلء بلک ات.",
"passwordsent": "یک نوکین کلمه رمزی په آدرس ایمیل ثبت بوتگین په \"$1\" دیم دهگ بیت.\nلطفا بعد چه دریافت وارد بیت",
"blocked-mailpassword": "شمی آدرس آی پی چه اصلاح کتن محدود بوتت و اجازت نداریت په خاطر جلوگیری چه سو استفاده چه عملگر کلمه رمز استفاده بکنت.",
- "eauthentsent": "یک ایمیل تاییدی په نامتگین آدرس ایمیل دیم دهگ بوت.\nپیش چه هردابین ایمیلی په حساب دیم دیگ بین، شما بایدن چه دستور العملی که ته ایمیل آتکه پیروی کنیت په شی که شمی حساب که شمی گنت تایید بیت.",
- "throttled-mailpassword": "یک کلمه رمز یاد آوری پیش تر دیم دهگ بوتت ته {{PLURAL:$1|ساعت|$1 ساعت}} ساعت پیش.\nپه جلوگرگ چه سو استفاده فقط یک کلمه رمز یاد آوری هر$1 ساعت دیم دهگ بیت.",
+ "eauthentsent": "یک ایمیلء پر شمئی ایمیل ادرسء تاییدء پر لکتگین ایمیلء راهیگ بوت.\nپیسر چریشی که ادگر ایمیلء راهیگ بیت، ایمیلء توضیحانء پر ائ واسته که هما ادرس المء شمئیگ انت رهچار بکن ات.",
+ "throttled-mailpassword": "یک ایمیلء پر پسوردء واترء مان $1 {{PLURAL:$1|ساهت|ساهت}} پیسریگء راهیگ بیتگ انت.\nپر هلاپء دیمداریء، هر $1 {{PLURAL:$1|ساهت|ساهت}} تهنا یک ایمیلء گون پسوردء واترء راهیگ بیت انت.",
"mailerror": "حطا دیم دهگ ایمیل:$1",
"acct_creation_throttle_hit": "شرمنده، لهتی پیسرگین چارون گون شمی آی زیگ لهتی {{PLURAL:$1|1 حساب|$1 حساب}} شر کتت , که گیشترین حد مجاز ته ای زمان انت.\nهنچوش چاروکان گون ای آی پی ن توننت گیشتر الان حساب شرکننت.",
- "emailauthenticated": " $3 شمی آدرس ایمیل ته $2 تصدیق بوت.",
- "emailnotauthenticated": "په آدرس ایمیل هنگت تصدیق نه بوتت.\nهچ ایمیلی په جهلیگین ویژگی دیم دهگ نه بیت.",
+ "emailauthenticated": "شمئی ایمیلء مان $2 ساهت $3 تائید بوت.",
+ "emailnotauthenticated": "شمئی ایمیل ادرسء انیگء تائید نبیتگ انت.\nپر جهلیگین بابت ان هچ ایمیلء راهیگ نبیت.",
"noemailprefs": "یک آدرس ایمیل په کار کتن ای ویژگیان مشخص کنیت.",
"emailconfirmlink": "وتی آدرس ایمیل تایید کن",
"invalidemailaddress": "آدرس ایمیل قبول نه بیت چوش که جاه کیت یک فرمت نامعتبری هست.\nلطفا یک آدرس ایمیل هو-فرمتی وارد کنیت یا ای فیلد هالیک بلیت.",
+ "cannotchangeemail": "مان ائ ویکیء اکانتء ایمیلان ڈگل بیت نکنت انت.",
+ "emaildisabled": "ائ سایتء نتوانیت ایمیل راهیگ بکنت انت.",
"accountcreated": "حساب شر بوت",
- "accountcreatedtext": "Øساب کاربر Ù¾Ù\87 $1 شر بÙ\88ت.",
+ "accountcreatedtext": "اکاÙ\86تء پر [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|تراÙ\86]]) اÚ\88 بÛ\8cتگ اÙ\86ت.",
"createaccount-title": "شرکتن حساب په {{SITENAME}}",
"createaccount-text": "یکی یک حساب په شمی آدرس ایمیل ته {{SITENAME}} گون نام ($4) \"$2\"، گون کلمه رمز \"$3\" شرکتت.\nشما بایدن وارد بیت و وتی کلمه رمز الان عوض کنیت.\n\nشما شاید ای پیام شموشیت اگه ای ای حساب گون حطا شر بوتت.",
- "login-throttled": "شما په کلمه رمز ای حساب باز جهد کتت نوکی. لطفا صبر کنیت و. رندا جهد کنیت.",
+ "login-throttled": "شما انیگ پر لاگین کتنء چنت بار جهد کتگ ات. دزبندی انت پیسر چه پدایین جهدء $1 موه بداریت.",
+ "login-abort-generic": "شمئی لاگینء پکا نبیت - Aborted",
"loginlanguagelabel": "زبان: $1",
+ "suspicious-userlogout": "شمئی لوٹ پر در شتن چه سیستمء رد بوت پرچا که چوش که پیداگ انت ائ لوٹ چه هرابین بروزر یانکه پراکسیء راهیگ بیتگ انت.",
+ "createacct-another-realname-tip": "اصلیگین نام ایهتیاری انت.\nاگان آئرا بلک ات رهشونء درگتء پر شمئی سیاهگان چه اصلیگین نام کارمرز بیت انت.",
+ "pt-login": "لاگین",
+ "pt-login-button": "لاگین",
+ "pt-createaccount": "اکانتء اڈ بکن",
+ "pt-userlogout": "در شُتن",
+ "php-mail-error-unknown": "نامالومین ارور مان تابع mail() پیاچپی",
+ "user-mail-no-addy": "جهد پر ایمیلء راهیگ گیر چه ایمیل ادرس",
+ "user-mail-no-body": "جهد پر هالیگ یانکه هوردین ایمیلء راهیگء",
"changepassword": "کلمه رمز عوض کن",
- "resetpass_announce": "شما گون یک هنوکین کد ایمیل بوتگین وارد بوتءیت.\nپه تمام کتن ورود، شما باید یک نوکین کلمه رمز اداں شرکنیت",
+ "resetpass_announce": "شما پر وتی لاگینء آسر کتنء، نوکین پسوردء تیار بکن ات.",
"resetpass_text": "<!-- متن دان هورکن -->",
"resetpass_header": "حساب کلمه رمزءَ عوض کن",
"oldpassword": "کلمه رمز کهنگین:",
"newpassword": "نوکین کلمه رمز:",
"retypenew": "کلمه رمز دگه بنویس",
"resetpass_submit": "تنظیم کلمه رمز و ورود",
- "changepassword-success": "شمی کلمه رمز گون موفقیت عوض بون! هنو شما وارد بیگیت...",
+ "changepassword-success": "شمئی پسورد پر درستیء ٹگل بیت!",
+ "changepassword-throttled": "شما انیگ پر لاگین کتنء چنت بار جهد کتگ ات. دزبندی انت پیسر چه پدایین جهدء $1 موه بداریت.",
"resetpass_forbidden": "کلمات رمز نه توننت عوض بنت.",
"resetpass-no-info": "په مستقیمین دسترسی په ای صفحه شما بایدن وارد سایت بیت",
"resetpass-submit-loggedin": "عوض کتن کلمه رمز",
+ "resetpass-submit-cancel": "کنسیل",
"resetpass-wrong-oldpass": "کلمه رمز موقت یا هنوکین رمز شر نهنت.\nبلیکن شما الان وتی کلمه رمز عوض کتت یا یک نوکین موقتین رمزی لوٹت.",
+ "resetpass-recycled": "دزبندی انت وتی پسوردء پر ادگرین چیزء گیر چه انیگین پسوردء ٹگل دئیت.",
+ "resetpass-temp-emailed": "شما گون یک موکتین ایمیل کدء مان بیتگ ات.\nپر لاگینء آسرء، شما ضرورنت نوکین پسوردء ادان لاک ات:",
"resetpass-temp-password": "موقتین کلمه رمز:",
+ "resetpass-abort-generic": "پسوردء ٹگل گون یک اکتنشنء واسته کنسیل بیتگ انت.",
+ "resetpass-expired": "شمئی پسوردء مالومین وهد هلتگ انت. دزبندی انت پر لاگین کتن نوکین پسوردء تیار کن ات.",
+ "resetpass-expired-soft": "شمئی پسوردء مالومین وهد هلتگ انت ءُ نوکین پسوردء اڈ کتن ضرور انت. دزبندی انت انیگء نوکین پسوردء بزیر ات، یانکه پر رندیگین تیار کتنء، ائ بٹنء \"{{int:resetpass-submit-cancel}}\" سرء کلیک کن ات.",
+ "resetpass-validity-soft": "شمئی پسورد درست نه انت: $1\nدزبندی انت انیگء نوکین پسوردء بزیر ات یانکه ائ بٹنء «{{int:resetpass-submit-cancel}}» سرء کلیک کن ات که رندا آئرا تیار کن ات.",
+ "passwordreset": "نوکین پسوردء بلوٹ",
+ "passwordreset-text-one": "پر وتی پسوردء واترء ائ فرمء پکا کن ات.",
+ "passwordreset-text-many": "{{PLURAL:$1|اگان لوٹت ایمیلء گون موکتین پسوردء پر شما راهیگ ببیت، یکئ چه ائ جاگاهانء پر بکن ات.}}",
+ "passwordreset-legend": "نوکین پسوردء بلوٹ",
+ "passwordreset-disabled": "پسوردء واتر کتن مان ائ ویکیء نافعال بیتگ انت.",
+ "passwordreset-emaildisabled": "ایمیلء حالتان مان ائ ویکیء نافعال بیتگ انت.",
+ "passwordreset-username": "یوزرنام:",
+ "passwordreset-domain": "دامین:",
+ "passwordreset-capture": "آسریگین ایمیل پیش دارگ بیت؟",
+ "passwordreset-capture-help": "اگان ائ گزینگ رء نشانیگ بهل ات، یک ایمیلء (گون موکتین پسوردء) شما رء پیش دارگ بیت ءُ هنچوش پر کاربرء راهیگ بیت انت.",
+ "passwordreset-email": "ایمیل ادرس:",
+ "passwordreset-emailtitle": "اکانتء جزئیات مان {{SITENAME}}",
+ "passwordreset-emailtext-ip": "یک شهسء (بلکین شما، گون آیپیء نشانیگ $1) شمئی پسوردء واترء {{SITENAME}} ($4) لوٹتگ انت. {{PLURAL:$3|اکانت|اکانتان}} گون ائ ایمیل ادرسء همگرنچ انت:\n\n$2\n\n{{PLURAL:$3|ائ موکتین پسورد|ائ موکتین پسوردان}} رند چه {{PLURAL:$5|یک روچ|$5 روچ}} باطل بیت انت.\nشما پیکن انیگء لاگین کن ات ءُ نوکین پسوردء بزیر ات. اگان شمئی پگر انت که ادگر شهسء ائ لوٹء راهیگ کتگ یانکه وتی پیسریگین پسوردء هیال کت ات ءُ رندء نلوٹیت آئرا ٹگل دئیت، بیت که ائ پیگامء ناگند بزان ات ءُ وتی پیسریگین پسوردء کارمرز کن ات.",
+ "passwordreset-emailtext-user": "کاربر $1 چه {{SITENAME}} شمئی پسوردء واترء لوٹ مان {{SITENAME}} ($4) کتگ انت. {{PLURAL:$3|اکانت|اکانتان}} چیریگین کاربر گون ائ ایمیل ادرس همگرنچ انت:\n\n$2\n\n{{PLURAL:$3|ائ موکتین پسورد|ائ موکتین پسوردان}} رند چه {{PLURAL:$5|یک روچ|$5 روچ}} باطل بیت انت.\nشما ضرور انت انیگء لاگین کن ات ءُ نوکین پسوردء بزیر ات. اگان ادگر شهسء ائ لوٹء راهیگ کتگ انت، یانکه وتی اصلیگین پسوردء هیال کت ات ءُ رندء نلوٹ ات آئرا ٹگل دئیت، بیت که ائ پیگامء نگند بزان ات ءُ وتی پیسریگین پسوردء کارمرز کن ات.",
+ "passwordreset-emailelement": "یوزرنام: $1\nموکتین پسورد: $2",
+ "passwordreset-emailsent": "یک ایمیلء گون پسوردء واترء راهیگ بوت.",
+ "passwordreset-emailsent-capture": "یک ایمیلء پر پسورد واترء واسته که جهلیگء پیش دارگ بیت، راهیگ بیتگ انت.",
+ "passwordreset-emailerror-capture": "واترین ایمیل، که جهلیگء پیش دارگ بیت، اڈ بوت، بلئی آئی راهیگ پر {{GENDER:$2|کاربر}} پکا نبوت: $1",
+ "changeemail": "ایمیل ادرسء ٹگل بدئ",
+ "changeemail-header": "وتی اکانتء ایمیل ادرسء ٹگل بدئ",
+ "changeemail-text": "ائ فرمء پکا کن ات تانکه شمئی ایمیلء ٹگل به بیت. پریشی که ائ تغییرء تایید کن ات ضرور انت وتی پسوردء بلک ات.",
+ "changeemail-no-info": "پر یکپارگین دزرسی مان ائ تاکء پیکن لاگین کن ات.",
+ "changeemail-oldemail": "انیگین ایمیل ادرس:",
+ "changeemail-newemail": "نوکین ایمیل ادرس:",
+ "changeemail-none": "هج کجام",
+ "changeemail-password": " {{SITENAME}} شمئی پسورد:",
+ "changeemail-submit": "ایمیلء ٹگل بدئ",
+ "changeemail-cancel": "کنسیل",
+ "changeemail-throttled": "شما انیگ پر لاگین کتنء چنت بار جهد کتگ ات. دزبندی انت پیسر چه پدایین جهدء $1 موه بداریت.",
+ "resettokens": "پجاروکان(tokens)ی واتر",
+ "resettokens-text": "شما توان ات پجاروکان(tokens) که دزرسیء اجازت پر شمئی وتیگین دیتا همگرنچ گون شمئی اکانتء دینت، واتر بکن ات.\nهما درگتء ائ کار بیت کنت که نامالومین شهسء شمئی اکانتء لاگین کتگ انت.",
+ "resettokens-no-tokens": "هچ پجاروکء پر واترء ودی نبوت.",
+ "resettokens-legend": "پجاروکان(tokens)ی واتر",
+ "resettokens-tokens": "پجاروکان(tokens):",
+ "resettokens-token-label": "$1 (انیگین اندازگ: $2)",
+ "resettokens-watchlist-token": "ویب فیدء پجاروک [[Special:Watchlist|پیجانی تغییرات که آهانء رهگر کن ات]] (اتم/آراساس)",
+ "resettokens-done": "پجاروکانی واتر.",
+ "resettokens-resetbutton": "درچتگین پجاروکانء واتر بکن",
"bold_sample": "پررنگین متن",
"bold_tip": "پررنگین متن",
"italic_sample": "ایتالیکی متن",
"showpreview": "بازبین پیش دار",
"showdiff": "تغییرات پیش دار",
"anoneditwarning": "'''هوژاری:''' شما وارد نه بیتگیت.\nشمی آی پی ته تاریح اصلاح ای صفحه ثبت بیت.",
+ "anonpreviewwarning": "''شما مان سیستمء لاگین نکتگ. ذخیره کتنء حالت شمئی آیپیء نشانیگ مان ائ پیجء هاپزگ سبت بیت انت.''",
"missingsummary": "'''یادآوری:''' شما یک خلاصه چه اصلاح وارد نه کرت.\nاگر دگه کلیک کنیت ذخیره آ، شمی اصلاح به بی آی ذخیره بنت.",
"missingcommenttext": "لطفا یک نظری وارد کنیت جهل آ",
- "missingcommentheader": "'''یاداوری:'' شما یک موضوع/سرخط په ای نظر وارد نکتت.\nاگر شما دگه ذخیره کلیک کنیت، شمی اصلاح بی آی ذخیره بنت.",
+ "missingcommentheader": "'''هالداری:'' شما یک موضوع/سرهت پر ائ کامنت نهشتگ ات.\nاگان دوبارگ بٹن «{{int:savearticle}}» سرء کلیک کن ات شمئی ویرایش گیر چه آئیء ذخیرگ بیت انت.",
"summary-preview": "خلاصه بازبینی:",
"subject-preview": "بازبین موضوع/سرخط:",
"blockedtitle": "کاربر محدود بوتت",
"blockednoreason": "هچ دلیلی دهگ نه بیته",
"whitelistedittext": "شما باید $1به اصلاح کتن صفحات.",
"confirmedittext": "شما بایدن وتی آدرس ایمیل آ پیش چه اصلاح کتن صفحات تایید کنیت.\nلطفا وتی آدرس ایمیل آی چه طریق [[Special:Preferences|ترجحات کاربر]] تنظیم و معتبر کنیت.",
- "nosuchsectiontitle": "هچ چوشن بخش",
- "nosuchsectiontext": "Ø´Ù\85ا سعÛ\8c کت Û\8cÚ© بخشÛ\8c اصÙ\84Ø§Ø Ú©Ù\86Û\8cت Ú©Ù\87 Ù\86Û\8cستÙ\86.",
+ "nosuchsectiontitle": "هنچوشین بهرء ودی نبوت",
+ "nosuchsectiontext": "Ø´Ù\85ا جÙ\87د کتگ پر Û\8cÚ© بÙ\87رء ادÛ\8cت کتÙ\86Ø¡ Ú©Ù\87 Ù\85Ù\88جÙ\88د Ù\86Ù\87 اÙ\86ت .\nÙ\85Ù\85Ú©Ù\86 اÙ\86ت Ù\87Ù\85ئ درگتء Ú©Ù\87 Ø´Ù\85ا Ù¾Û\8cجء Ú\86ارگ کتگ ات ائ سÙ\8fرÛ\8cÙ\86Ú¯ Û\8cاÙ\86Ú©Ù\87 Ù\87زپ بÛ\8cتگ اÙ\86ت.",
"loginreqtitle": "ورود نیازنت",
"loginreqlink": "ورود",
"loginreqpagetext": "شما باید $1 په گندگ دگه صفحات.",
"accmailtitle": "کلمه رمز دیم دات",
- "accmailtext": "کلمه رمز په [[User talk:$1|$1]] دیم دهگ بوت په $2.\nکلمه رمز په نوکین حساب ته صفحه ''[[Special:ChangePassword|عوض کتن رمز]]'' وهدی که وارد بیتت تونیت بدل بیتن",
+ "accmailtext": "یک پسوردء [[User talk:$1|$1]] پر $2 راهیگ بوت. بیت آئرا چه پیجء ''[[Special:ChangePassword|پسوردء ٹگل]]'' که لاگینء درگتء پیش دارگ بیت ٹگل دئیت.",
"newarticle": "(نوکین)",
"newarticletext": "شما رند چه یک لینکی په یک صفحه ی که هنو نیستند اتکگیت.\nپه شر کتن صفحه، شروع کن نوشتن ته جعبه جهلی(بچار [$1 صفحه کمک] په گیشترین اطلاعات).\nاگر شما اشتباهی ادانیت ته وتی بروزر دکمه ''Back'' بجن.",
"anontalkpagetext": "----'' ای صفحه بحث انت په یک ناشناس کاربری که هنگت یک حسابی شر نه کتت یا آی ا ستفاده نه کتت. اچه ما بایدن آدرس آی پی عددی په پچاه آرگ آیی استفاده کنین.\nچوشن آدرس آی پی گون چندین کاربر استفاده بیت.\nاگه شما یک کاربر ناشناس ایت وی حس کنیت بی ربطین نظر مربوط شمی هست، لطفا [[Special:UserLogin|وارد بیت ]] یا [[Special:UserLogin/signup|حسابی شرکن]] دان چه هور بییگ گون ناسناسین کاربران پرهیز بیت.''",
"noarticletext": "هنو هچ متنی ته ای صفحه نیست.\nشما تونیت [[Special:Search/{{PAGENAME}}|گردیت په عنوان صفحه]] ته دگه صفحات یا<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} گردگ په مربوطین آمار],\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اصلاح ای صفحه]</span>.",
+ "noarticletext-nopermission": "ائ تاکء رء انیگ هچ سیاهگء نه انت .\nشما توانت مان ادگر تاکان [[Special:Search/{{PAGENAME}}|ائ عنوانء رء پٹوپول بکن ات]]،\nیانکه <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} مان یکپیمیگین سیاهگان شوهاز بکن ات]</span> بلئ شما رء پر ائ پیجء اڈ کتنء اجازت نه انت.",
+ "missing-revision": "ویرایش #$1 چه پیجء «{{FULLPAGENAME}}» موجود نه انت.\n\nبلکین چه نوک نکتنء بابتء هزپ بیتگ انت.\nتوان ات گیشترین جزئیات رء مان [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} هزپانی سیاهگ] ودی بکن ات.",
"userpage-userdoesnotexist": "حساب کاربر \"<nowiki>$1</nowiki>\" ثبت نهنت. لطفا کنترل کنیت اگه شما لوٹیت ای صفحه یا شر/اصلاح کنیت.",
- "clearyourcache": "'''توجه:''' بعد چه ذخیره کتن، شما شاید مجبور بیت چه وتی ذخیره ی بروزر رد بیت تا تغییرات بگندیت. '''Mozilla / Firefox / Safari:'' ''Shift'' جهل داریت همی وهدی که کلیک کنیت ''Reload'' یا بداریت ''Ctrl-Shift-R'' (''Cmd-Shift-R'' on Apple Mac);'''IE:''' ''Ctrl'' بداری وهدی که کلیک ''Refresh' یا 'Ctrl-F5''; '''Konqueror:''': راحت کلیک کن دکمه ''Reload'' یا بدار ''F5''; '''Opera''' کاربر بایدن ته ''Tools→Preferences'' ذخیره پاک کنت.",
- "usercssyoucanpreview": "'''نکته:''' چه دکمه 'Show preview' په آزمایش کتن CSS پیش چه ذخیره کتن استفاده کن",
- "userjsyoucanpreview": "'''نکته:''' چه دکمه 'Show preview' په آزمایش کتن JS پیش چه ذخیره کتن استفاده کن",
+ "userpage-userdoesnotexist-view": "ائ یوزر اکانت «$1» سبت نبیتگ انت.",
+ "blocked-notice-logextract": "ائ کاربر انیگء بلاک بیتگ انت.\nآهرین سیاهگئ که گون بلاکء همگرنچ انت جهلیگء آتکگ انت:",
+ "clearyourcache": "<strong>بزان:</strong> رند چه ذخیرگ کتنء ممکن انت پر ٹگلانی گندگء وتی بروزرئ هاپزگء پهک کتن لوٹ به بیت.\n*<strong>پایرپاکس / ساپاری:</strong> کلیت <em>Shift</em> رء جهل بدار ات ءُ رندء ائ بٹنء <em>Reload</em> کلیک بکن ات، یانکه ائ کلیتان <em>Ctrl-F5</em> یانکه <em>Ctrl-R</em> رء گون همدگرء جهل بدار ات (مان اپل ءُ مکینتاشء سیستمان ائ کلیتان <em>⌘-R</em>)\n*<strong>گوگل کروم:</strong> ائ کلیتان <em>Ctrl+Shift+R</em> رء گون هم جهل بدار ات (مان اپل ءُ مکینتاشء سیستمان ائ کلیتان <em>⌘-Shift-R</em>)\n*<strong>اینترنت اکسپلورر:</strong> کلیت <em>Ctrl</em> رء جهل بدار ات ءُ رندء ائ بٹنء <em>Refresh</em> کلیک بکن ات، یان ائ کلیتان <em>Ctrl-F5</em> رء گون همدگرء جهل بدار ات.\n*<strong>اپرا:</strong> وتی بروزرء چیرداتگین هاپزگ رء چه ائ منو <em>Tools → Preferences</em> پهک بکن ات.",
+ "usercssyoucanpreview": "'''بزان:''' پیسر چه سی اس اسء ذخیرگ کتنء، گون ائ بٹن '''{{int:showpreview}}''' بچکاس ات.",
+ "userjsyoucanpreview": "'''بزان:''' پیسر چه جاوا اسکریپتء ذخیرگ کتنء، گون ائ بٹن '''{{int:showpreview}}''' بچکاس ات.",
"usercsspreview": "''''بزان که شما فقط وتی CSS کاربری بازبینی کنین. هنگنت آیی ذخیره نه بوتت!''''",
"userjspreview": "''''په یاد دار که شما فقط وتی کاربری JavaScript بازبینی/آزمایش کنگیت، هنگت ذخیره نه بوتت!''''",
+ "sitecsspreview": "<strong> شمارء هیالداری ببیت که انیگء تهنا پیشچارگ چه ائ سی اس اسء رء گند ات.\nآئی انگت ذخیرگ نبیتگ انت </strong>",
+ "sitejspreview": "<strong> شمارء هیالداری ببیت که انیگء تهنا پیشچارگ چه ائ جاوا اسکریپٹء رء گند ات.\nآئی انگت ذخیرگ نبیتگ انت </strong>",
"userinvalidcssjstitle": "'''هوژاری:''هچ جلدی نیست\"$1\".\nبزان که صفحات .css و .js چه عناوین گون هوردین حرف استفاده کننت، مثلا {{ns:user}}:Foo/vector.css بدل به په {{ns:user}}:Foo/Vector.css.",
"updated": "(په روچ بیتگین)",
"note": "'''یادداشت:'''",
- "previewnote": "'''شی فقط یک بازبینی انت;\nتغییرات هنگت ذخیره نهنت. '''",
+ "previewnote": "<strong> بزان که ائ تهنا یک پیشچارگء انت</strong>\nشمئی ٹگلان انگتء ذخیرگ نبیتگ انت!",
+ "continue-editing": "شتن پر ادیت کنوکین جاگاه",
"previewconflict": "ای بازبین متنء پیش داریت ته منطفه بالدی اصلاحی هنچوش که پیش دارگ بیت اگه شما انتخاب کنیت ذخیره",
"session_fail_preview": "'''شرمنده! ما نه تونست شمی اصلاحء په خاطر گار کتن دیتا دیوان پردازش کنین.\nطلف دگه سعی کنیت. اگر هنگت کار نکنت یک بری [[Special:UserLogout|دربیت]] و پیدا وارد بیت.'''",
"session_fail_preview_html": "'''شرمنده! ما نه تونست شمی اصلاحء په خاطر گار کتن دیتا دیوان پردازش کنین.'''\n\n''په چی که {{SITENAME}} HTML هام فعالنت، بازبین په خاطر حملات JavaScript پناهنت.''\n\n''' اگر شی یک قانونی تلاش اصلاحنت، دگه کوشش کنیت. اگر هنگت کار نکنت یک بری [[Special:UserLogout|دربیت]] و دگه وارد بیت.'''",
"token_suffix_mismatch": "''' شمی اصلاح رد بوت په چی که شمی کلاینت نویسگ کاراکترانی په هم جتت.\nاصلاح رد بوت داں چه هراب بیگ متن صفحه جلوگیری بیت.\nشی لهتی وهد پیش کت که شما چه یک هرابین سرویس پروکسی وبی استفاده کنیت.'''",
+ "edit_form_incomplete": "<strong>لهتی چه ادیت فرمء بهران پر سرورء نرستگ انت؛ پکا بزان ات که شمئی ادیتان پکا انت و رندء چدوبارگ جهد کن ات</strong>",
"editing": "اصلاح $1",
+ "creating": "اڈ کتن $1",
"editingsection": "اصلاح $1(بخش)",
"editingcomment": "اصلاح $1 (نوکین بخش)",
"editconflict": "جنگ ورگ اصلاح: $1",
"yourdiff": "تفاوتان",
"copyrightwarning": "لطفا توجه بیت که کل نوشته یات ته {{SITENAME}} تحت $2 نشر بنت.(بچار په جزیات$1).\nاگه شما لوٹیت شمی نوشتانک اصلاح و دگه چهاپ مبنت، اچه آیانا ادان مهلیت.\nشما ما را قول دهیت که وتی چیزا بنویسیت یا چه یک دامین عمومی کپی کتگیت.\n''' نوشتانکی که کپی رایت دارند بی اجازه ادا هور مکنیت'''",
"copyrightwarning2": "لطفا توجه کنیت که کل مشارکاتن ته {{SITENAME}} شاید اصلاح, عوض و یا توسط دگه شرکت کننده آن حذف بنت.\nاگر شما نه لوٹیت شمی نوشتاک گون بی رحمی اصلاح مه بنت، اچه شما آیء ادان دیم مه دهیت.<br />\nشما هنچوش ما را قول دهیت که شما شی وت نوشتت یا ایء چه یک دامین عمومی یا هنچوشین آزاتین منبع کپی کتیت.(بچار $1 په جزییات).\n''' نوشتاکی که حق کپی دارنت بی اجازت دیم مه دهیت!'''",
- "longpageerror": "'''Øطا: Ù\85تÙ\86Û\8c Ú©Ù\87 Ø´Ù\85ا دÛ\8cÙ\85 داتت $1 Ú©Û\8cÙ\84Ù\88 باÛ\8cتتØ\8c Ú©Ù\87 Ú\86Ù\87 Ú¯Û\8cشترÛ\8cÙ\86 Øد $2 Ú©Û\8cÙ\84Ù\88باÛ\8cت Ù\85زÙ\86\nØ¢Û\8c Ù\86Ù\87 تÙ\88Ù\86Û\8cت ذخÛ\8cرÙ\87 بÙ\88ت.'''",
- "readonlywarning": "'''هوژاری: دیتابیس به تعمیرات کبلنت، اچه شما نه تونیت وتی اصلاحات هنو ذخیره کنیت.\nشما شاید بلوٹیت متنء تع یم فایل متنی کپی و پیست کنیت و آیء ذخیره کنیت.'''\nمدیری که آیء کبل کتت ای توضیحی داتت: $1",
- "protectedpagewarning": "'''هوژاری: ای صفحه په کبلنت چی که فقط کابران گون اجازت مدیر سیستم توننت آیء اصلاح کننت.'''",
- "semiprotectedpagewarning": "''''توجه:'''' ای صفحه کبلنت چوش که فقط ثبت نامی کابران توننت آیء اصلاح کننت.",
+ "longpageerror": "'''ارÙ\88ر: ائ سÛ\8cاÙ\87گء Ú©Ù\87 راÙ\87Û\8cÚ¯ کتگ ات {{PULAR:$1|Û\8cÚ© Ú©Û\8cÙ\84Ù\88باÛ\8cت|$1 Ú©Û\8cÙ\84Ù\88باÛ\8cت}} اÙ\86دازگ دارÛ\8cت. ائ اÙ\86دازگ Ú\86Ù\87 Ù\85اکسÛ\8cÙ\85Ù\85Ø¡ {{PLURAL:$2|Û\8cÚ© Ú©Û\8cÙ\84Ù\88باÛ\8cت|$2 Ú©Û\8cÙ\84Ù\88باÛ\8cت}} Ú¯Û\8cشتر اÙ\86ت.'''\nÙ\86بÛ\8cت Ú©Ù\87 آئرا ذخÛ\8cرگ بکÙ\86 ات.",
+ "readonlywarning": "'''هژاری: دیتابیس پر جوڑ کتنء واسته کبل بیتگ انت، پمیشکا انیگء نبیت که وتی ادیتانء ذخیرگ بکن ات.'''\nاگان لوٹ ات وتی سیاهگء مان یک تکست فایلء کپی و پر آیوکء ذخیرگ بکن ات.\n\nهما ماسٹر که آئرا کبل کتگ ائ توضیحء درشان کتگ انت: $1",
+ "protectedpagewarning": "'''هوژاری: ائ تاک پراتکت بیتگ انت، گڑا تهنا کاربرانء گون ماسٹری حالتء توان انت که آئرا ادیت بکن انت'''\nآهرین سیاهگ که گون ائ بابتء همگرنچ انت جهلیگء آتکگ انت:",
+ "semiprotectedpagewarning": "'''بزان:''' ائ پیج کبل بیتگ تانکه تهنا رجستر کتگین کاربران بتوان انت آئرا ادیت بکن انت.\nآهرین سیاهگ که گون ائ بابتء همگرنچ انت جهلیگء آتکگ:",
"cascadeprotectedwarning": "''هوژاری''ای صفحه کبلنت چوش که فقط کابران گون دسترسی مدیر سیستم توننت آییء اصلاح کننت،په چی که آیی ته چهلین حمایت آبشاری {{PLURAL:$1|صفحات|صفحه}}:",
- "titleprotectedwarning": "'''هوژاری: ای صفحه کبلنت چوش که فقط لهتی کاربر گون [[Special:ListGroupRights|خاصین حق]] تواننت آیء شر کننت.'''",
+ "titleprotectedwarning": "'''هوژاری: ائ پیجء پر ائ پیمء کبل بیتگ که پر آئیء اڈ کتنء [[Special:ListGroupRights|خاصین اجازت]] ضرور انت.'''\nآهریگین سیاهگ که گون ائ بابتء همگرنچ انت جهلیگء آتکگ انت:",
"templatesused": "{{PLURAL:$1|تمپلت|تمپلت}} که ته ای صفحه کارمز بیتت:",
"templatesusedpreview": "{{PLURAL:$1|تمپلت|تمپلت}} ته ای بازبینی کارمرز بوتت",
- "templatesusedsection": "تمپلتانی که ته ای بخش به کار رونت",
+ "templatesusedsection": "{{PLURAL:$1|تمپلٹ|تمپلٹ}} کارمرز بوتگین مان ائ بهر:",
"template-protected": "(محافظتین)",
"template-semiprotected": "(نیم محافظتی)",
"hiddencategories": "ای صفحه عضوی چه {{PLURAL:$1|1 hidden category|$1 پناهین دسته جات}}:",
"edittools": "<!-- <strong>په کپی و پست کتن چه CTRL+V , CTRL+C استفاده کنیت.</strong> -->",
"nocreatetext": "{{SITENAME}} شما را چه شرکتن نوکین صفحه منه کته.\nشما تونیت برگردیت و یک پیشگین صفحه ای اصلاح کنیت، یا [[Special:UserLogin|وارد بیت یان یک حسابی شرکنیت]].",
"nocreate-loggedin": "شما را اجازت په شرکتن نوکین صفحات نیست.",
- "permissionserrors": "حطای اجازت",
+ "sectioneditnotsupported-title": "ائ بهرانئ ادیت کتن ساپورٹ نه بیت",
+ "sectioneditnotsupported-text": "ائ بهرانئ ادیت کتن مان ائ پیجء ساپورٹ نه بیت",
+ "permissionserrors": "ارور جاگاه دزرسی",
"permissionserrorstext": "شما را اجازت په انجام آی نیست، په جهلیگین دلیل {{PLURAL:$1|دلیل|دلایل}}:",
"permissionserrorstext-withaction": "شما را اجازت په $2, په خاطر جهلیگین {{PLURAL:$1|دلیل|دلایل}}:",
"recreate-moveddeleted-warn": "هوژاری: شما یک صفحه ای دگه شرکنگیت که پیشتر حذف بوتت.'''\n\nشما بایدن توجه کنیت که ادامه اصلاح ای صفحه درستنت.\nآمار حذف و جاه په جاهی ای صفحه په شمی حاطرء ادان هستن:",
"edit-gone-missing": "نه تونیت صفحهء په روچی کنت.\nچوش که جاه کیت آیی حذف بوتگت.",
"edit-conflict": "جنگ اصلاحی",
"edit-no-change": "شمی اصلاح نادید گرگ بوت، په چی که هچ تغییری په متن دهگ نه بوت.",
+ "postedit-confirmation-created": "تاک اڈ بوت.",
+ "postedit-confirmation-restored": "تاک واتر بوت.",
+ "postedit-confirmation-saved": "شمئی ادیت ذخیرگ بوت.",
"edit-already-exists": "نه تونیت یک نوکین صفحه ای شر کنت.\nهنو شی هستن.",
+ "defaultmessagetext": "اصلیگین پیگامء سیاهگ",
+ "content-failed-to-parse": "تجزیگء $2 توکداریگ پر $1 مدل: $3 پکا نبوت",
+ "invalid-content-data": "توکداریگء دیتا مهتبر نه انت",
+ "content-not-allowed-here": "توکداریگ «$1» مان ائ پیج[[$2]] اجازت نه انت",
+ "editwarning-warning": "گون در شتن چه ائ پیج ممکن انت شمئی پهکین شانس که تان انیگء کٹ کتگ ات بیران بیت.\nاگان شما لاگین کتگ ات، بیت که ائ هژاریء مان ای بهر «{{int:prefs-editing}}» وتی پریفرنسء نافعال بکن ات..",
+ "editpage-notsupportedcontentformat-title": "توکداریگء فرمت ساپورٹ نه بیت",
+ "editpage-notsupportedcontentformat-text": "ائ توکداریگء فرمت $1 مان ائ توکداریگء تهر $2 ساپورٹ نبیتگ انت.",
+ "content-model-wikitext": "ویکیسیاهگ",
+ "content-model-text": "سادگین سیاهگ",
+ "content-model-javascript": "جاوا اسکریپٹ",
+ "content-model-css": "سی اس اس",
"expensive-parserfunction-warning": "هوژاری: ای صفحه شامل بازگین توار عملگر تجریه کنوک سنگیننت.\nآیی بایدن کمتر چه $2{{PLURAL:$2|توار|توار}}, داشته بیت ادان هنو $1 هست.",
"expensive-parserfunction-category": " صفحات گونبازگین توار عملگر تجریه کنوک",
"post-expand-template-inclusion-warning": "هوژاری: اندازه شامل تمپلت باز مزننت.\nلهتی تمپلتان هور نه بینت.",
"post-expand-template-argument-category": "صفحات شامل حذفی آرگومان آن تمپلت انت",
"parser-template-loop-warning": "تمپلت حقه ای درگبزگ بوت: [[$1]]",
"parser-template-recursion-depth-warning": "محدودیت عمق تررگ رد بوت ($1)",
+ "language-converter-depth-warning": "چه محدودیت عمق زبانانی کارمرز گؤست ات ($1)",
+ "node-count-exceeded-category": "پیج انی که گیش چه مکسیمم تعداد گره بیتگ انت",
+ "node-count-exceeded-category-desc": "کتگوری پر پیج انی که مان آهان ساب کنوگ برزتر شتگ انت.",
+ "node-count-exceeded-warning": "پیج چه مکسیمم تعداد گره گیش شُت",
+ "expansion-depth-exceeded-category": "پیج انی که چه مکسیمم تچک کتنء امک (عمق) گیش شتگ انت",
+ "expansion-depth-exceeded-category-desc": "کتگری پر پیج انی که مان آهان تچک کتنء امک(عمق) گیش شتگ انت.",
+ "expansion-depth-exceeded-warning": "پیج چه مکسیمم تچک کتنء امک(عمق) گیش شُت",
+ "parser-unstrip-loop-warning": "حلقهء unstrip ودی بوت",
+ "parser-unstrip-recursion-limit": "چه مکسیمم ارجاع مان دستور unstrip گیش شُت ات($1)",
+ "converter-manual-rule-error": "ارور مان قوانین مبدل دستی زبان",
"undo-success": "اصلاح برگشت نه بیت. لطفا مقایسه جهلگینء کنترل کنیت په تایید شی که شی هما انت که شما لوٹیت، و بعدا تغغیرات جهلی په تمام کتن بر نگردگ اصلاح ذخیره کنیت.",
"undo-failure": "اصلاح بر نرگردیت په خاطر تضاد میان اصلاحاتی",
"undo-norev": "اصلاح نه تونیت برگردیت په چی که آی وجود نهنت یا حذف بوتت.",
+ "undo-nochange": "چوش که پیداگ انت ویرایش مان انیگء باطل بوتگ انت.",
"undo-summary": "بازبینی برگردین $1 گون [[Special:مشارکتان/$2|$2]] ([[User talk:$2|گپ]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])",
+ "undo-summary-username-hidden": "بی اثر کتن نسخهٔ $1 گون یک نامالومین کاربرء واسته",
"cantcreateaccounttitle": "نه نونیت حساب شرکنت",
"cantcreateaccount-text": "شرکتن حساب چی ای آدرس آی پی ('''$1''') محدود بوتت توسط [[User:$3|$3]].\n\nدلیلی داتگین توسط $3 شی انت ''$2''",
+ "cantcreateaccount-range-text": "اکانتء اڈ کتن چه آی پی ادرسء مان ائ هوار '''$1'''، که شمئی آی پی ('''$4''') مان آئی توکاانت، گون [[User:$3|$3]] متوقف بیتگ انت.\nدرشان کتگین دلیل گون $3، $2 انت.",
"viewpagelogs": "آمار ای صفحه بچار",
"nohistory": "په ای صفحه تاریح اصلاح نیست.",
"currentrev": "هنوکین بازبینی",
"currentrev-asof": "هنوکین بازبینی چه $1",
"revisionasof": "بازبینی په عنوان $1",
- "revision-info": "بازبÛ\8cÙ\86Û\8c Ù¾Ù\87 داب $1 تÙ\88سط $2",
+ "revision-info": "تارÛ\8cخء Ù\86سخÙ\87 $1 Ú¯Ù\88Ù\86 {{GENDER:$6|$2}}$7",
"previousrevision": "←پیش ترین نسخه",
"nextrevision": "نوکین بازبینی→",
"currentrevisionlink": "هنوکین بازبینی",
"page_last": "اهرین",
"histlegend": "بخش تفاوت: په مقایسه کتن نسخه یان گزینه انتخاب کنیت اینتر یا دکمه بجن.<br />\nLegend: (cur) = تفاوتان گون هنوکین نسخه,\n(last) = تفاوت گون بعدی نسخه, M = هوردین اصلاح.",
"history-fieldset-title": "گردگ تاریح",
- "histfirst": "اولین",
- "histlast": "اهرین",
+ "history-show-deleted": "تهنا هزپ بیتگ انت",
+ "histfirst": "پیسریگ ترین",
+ "histlast": "نوکترین",
"historysize": "({{PLURAL:$1|1 بایت|$1 بایت}})",
"historyempty": "(هالیک)",
"history-feed-title": "تاریح بازبینی",
"history-feed-description": "تاریح بازبینی په ای صفحه ته ویکی",
"history-feed-item-nocomment": "$1 ته $2",
"history-feed-empty": "لوٹتگین صفحه موجود نهنت.\nشاید آی چه ویکی حذف بوتت یا نامی بدل بوتت.\nآزمایش کن[[Special:Search|گردگ ته ویکی]] په مربطین نوکین صفحات.",
- "rev-deleted-comment": "(Ù\86ظر زÙ\88رگ بÛ\8cتت)",
+ "rev-deleted-comment": "(Ù\88Û\8cراÛ\8cشء Ø®Ù\84اصگ Ù\87زپ بÙ\88ت)",
"rev-deleted-user": "(نام کاربری زورگ بیتت)",
"rev-deleted-event": "(کار آمار زورگ بیتت)",
- "rev-deleted-text-permission": "ای بازبینی صفحه چه آرشیو عمومی '''زورگ''' بیتت.\nشاید جزییاتی ته [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} حذف آمار]. بیت",
- "rev-deleted-text-unhide": "ای اصلاح چه ای صفحه '''زورگ بوتت'''.\nممکن انت اطلاعات مرتبط گون آیی ءَ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاهگ حذف] بگندیت.\nشما په عنوان یک مدیر هنوچوش توایت اگر بلوٹیت [$1 ای نسخه را بچاریت].",
+ "rev-deleted-user-contribs": "[یوزرنام یانکه یانکه آی پی ادرس هزپ بیتگ انت - ویرایش چیرداتگین مان هواربیتگان]",
+ "rev-deleted-text-permission": "ائ ویرایش چه ائ پیج '''هزپ بیتگ انت'''.\nبلکین اطلاعات گون آئی همگرنچء مان [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} هزپانی سیاهگ] موجوت بیت انت.",
+ "rev-deleted-text-unhide": "ائ ویرایش چه ائ پیج '''هزپ بیتگ انت'''.\nبلکین اطلاعات گون آئی همگرنچء مان [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} هزپانی سیاهگ] موجوت بیت انت.\nشما هنچوش اگان بلوٹ ات توان ات [$1 ائ نسخگء بچار ات].",
"rev-deleted-text-view": "ای بازبینی صفحه چه آرشیو عمومی '''زورگ''' بیتت.\nپه عنوان مدیر ته {{SITENAME}} شما تونیت آیء بگنیت;\nشاید جزییاتی ته ببیت [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} آمار حذف].",
"rev-deleted-no-diff": "شما نه تونیت تفاوت ای نسخه بچارت په چی که یکی چه نسخ چه عمومی آرشیو '''زورگ''' بوتت.\nممکن انت [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاهگ حذف] جزئیاتی ببیت.",
"rev-deleted-unhide-diff": "یکی چه ای دو نسخهٔ '''حذف بوتت'''.\nممکن انت اطلاعات این شی باره [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاهگ حذف] موجود ببیت.\nشما په عنوان یک مدیر هنگت توانیت اگر بلوٹیت [$1 ای تفاوت را بچاریت].",
"editundo": "خنثی کتن",
"searchresults": "نتایج گردگ",
"searchresults-title": "نتایج گردگ په \"$1\"",
- "toomanymatches": "بازگین هم دپ درگیزگ بوت، لطفا یک متفاوتین درخواست آزمایش کنیت",
"titlematches": "عنوان صفحه هم دپ نت",
"textmatches": "متن صفحه هم دپ بنت",
"notextmatches": "هچ متن صفحه هم دپ نهنت",
"tooltip-rollback": "\"ترین\" اصلا(ان) ته ای صفحه چه اهزس مشارکت کنوک ته گون یک کلیک.",
"tooltip-undo": "\"ترینگ\" ای اصلاح و پچ کن فرم اصلاحء ته حالت بازبینی. اجازت دن اضافه کتن یک دلیلی ته خلاصه",
"common.css": "/* CSS که اداننت په کل پوستان په کار رونت. */",
- "monobook.css": "/* CSS که اداننت کابران پوست مونوبوک تاثیر کننت */",
"common.js": "/* هر جاوا اسکریپتی ادان په کل کابران ته هر صفحه ای بار بیت. */",
- "monobook.js": "/* جاوا اسکریپت ادان فقط په کابرانی که چه پوست منوبوک استفاده کننت بار بیت. */",
"anonymous": "ناشناسین {{PLURAL:$1|کاربر|کاربران}} چه {{SITENAME}}",
"siteuser": "{{SITENAME}} کاربر $1",
"lastmodifiedatby": "ای صفحه اهری رندی که تغییر دهگ بیته $2, $1گون $3.",
"spam_reverting": "عوض کتن په آهری نسحه که شامل لینکان می بیت په $1",
"spam_blanking": "کل بازبینی آن شامل لینکان په $1, بوتت هالیکی",
"simpleantispam-label": "کنترل ضد اسپم.\nای شیء پر ''مکن''",
- "skinname-monobook": "منوبوک",
"markaspatrolleddiff": "نشان کن په داب نظارت بوتگین",
"markaspatrolledtext": "ای صفحه نشان کن په داب نظارت بوتگین",
"markedaspatrolled": "نشاننت په داب نظارتی",
"qbmyoptions": "Sakong mga pahina",
"faq": "PPK (Pirmihang Pighahapot na mga kahaputan)",
"faqpage": "Project:PPK (Pirmihang Pighahapot na mga Kahaputan)",
- "vector-action-addsection": "Idagdag an topic",
- "vector-action-delete": "puráon",
- "vector-action-move": "Ibalyó",
- "vector-action-protect": "Protektaran",
- "vector-action-undelete": "Bawion sa pagkapara",
- "vector-action-unprotect": "Ribayan an proteksyon",
- "vector-view-create": "Magmukna",
- "vector-view-edit": "Liwatón",
- "vector-view-history": "Tanawon sa historiya",
- "vector-view-view": "Basáha",
- "vector-view-viewsource": "Hilingón an ginikánan",
"actions": "Mga aksyon",
"namespaces": "Mga espasyong ngaran",
"variants": "Mga pinalaen",
"difference-missing-revision": "{{PLURAL:$2|sarong rebisyon|$2 mga rebisyon}} kaining diperensiya ($1) {{PLURAL:$2|na iyo an|kaidto na iyo an}} dae nanagboan.\n\nIni pirmihan na pinagkakausa sa paagi nin pagsusunod nin luwas sa petsang diff na kasugponan pasiring sa sarong pahina na pinagpura na.\nAn mga detalye mapuwedeng matatagboan sa [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan kan pinagpuraan].",
"searchresults": "Resulta kan paghahánap",
"searchresults-title": "Resulta kan paghahanap para sa \"$1\"",
- "toomanymatches": "Kadakol-dakol na angay an ipigbalik, probaran an ibang kahaputan",
"titlematches": "Angay an título kan artíkulo",
"textmatches": "Angay an teksto nin páhina",
"notextmatches": "Mayong ángay na teksto nin páhina",
"tooltip-summary": "Magkaag nin sarong halipot na sumaryo",
"interlanguage-link-title": "$1 - $2",
"common.css": "/** an CSS na pigbugtak digdi maiaaplikar sa gabos na mga skin */",
- "monobook.css": "/* an CSS na pigbugtak digdi makakaapektar sa mga parágamit kan Monobook skin */",
"common.js": "/* Arin man na JavaScript digdi maikakarga para sa gabos na mga parágamit sa kada karga kan páhina. */",
- "monobook.js": "/* Deprecado; gamiton an [[MediaWiki:common.js]] */",
"anonymous": "Bako-bistadong {{PLURAL:$1|paragamit|mga paragamit}} kan {{SITENAME}}",
"siteuser": "Paragamit kan {{SITENAME}} na si $1",
"anonuser": "{{SITENAME}} bako-bistadong paragamit $1",
"qbmyoptions": "Мае старонкі",
"faq": "Частыя пытаньні",
"faqpage": "Project:Частыя пытаньні",
- "vector-action-addsection": "Дадаць тэму",
- "vector-action-delete": "Выдаліць",
- "vector-action-move": "Перанесьці",
- "vector-action-protect": "Абараніць",
- "vector-action-undelete": "Аднавіць",
- "vector-action-unprotect": "Зьмяніць абарону",
- "vector-view-create": "Стварыць",
- "vector-view-edit": "Рэдагаваць",
- "vector-view-history": "Паказаць гісторыю",
- "vector-view-view": "Чытаць",
- "vector-view-viewsource": "Паказаць крыніцу",
"actions": "Дзеяньні",
- "vector-more-actions": "Болей",
"namespaces": "Прасторы назваў",
"variants": "Варыянты",
"navigation-heading": "Навігацыйнае мэню",
"mergehistory-empty": "Няма гісторыі рэдагаваньняў, якую магчыма аб'яднаць.",
"mergehistory-success": "$3 {{PLURAL:$3|вэрсія|вэрсіі|вэрсіяў}} з [[:$1]] пасьпяхова аб’яднаныя ў [[:$2]].",
"mergehistory-fail": "Не атрымалася аб'яднаць гісторыі старонак. Калі ласка, праверце парамэтры старонкі і часу.",
+ "mergehistory-fail-toobig": "Немагчыма аб’яднаць гісторыю, бо будзе перавышаны ліміт у $1 {{PLURAL:$1|1=вэрсію|вэрсіі|вэрсіяў}}, якія будуць перанесеныя.",
"mergehistory-no-source": "Не існуе крынічнай старонкі $1.",
"mergehistory-no-destination": "Не існуе мэтавай старонкі $1.",
"mergehistory-invalid-source": "Крынічная старонка мусіць мець карэктную назву.",
"difference-missing-revision": "{{PLURAL:$2|$2 вэрсія|$2 вэрсіі|$2 вэрсіяў}} з гэтымі адрозьненьнямі ($1) {{PLURAL:$2|не была|не былі}} знойдзеныя.\n\nЗвычайна гэта здараецца з-за пераходу па састарэлай спасылцы на старонку, якая была выдаленая.\nПадрабязнасьці можна знайсьці ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
"searchresults": "Вынікі пошуку",
"searchresults-title": "Вынікі пошуку для «$1»",
- "toomanymatches": "Знойдзена зашмат супадзеньняў з запытам, калі ласка, паспрабуйце зьмяніць запыт",
"titlematches": "Супадзеньні ў назвах старонак",
"textmatches": "Супадзеньні ў тэкстах старонак",
"notextmatches": "Супадзеньні ў тэкстах старонак ня знойдзеныя",
"windows-nonascii-filename": "Гэтая вікі не падтрымлівае назвы файлаў з спэцыяльнымі сымбалямі.",
"fileexists": "Файл з такой назвай ужо існуе. Калі ласка, праверце <strong>[[:$1]]</strong>, калі Вы ня ўпэўненыя, што жадаеце яго замяніць. [[$1|thumb]]",
"filepageexists": "Старонка апісаньня для гэтага файла ўжо існуе як <strong>[[:$1]]</strong>, але файла з такой назвай няма.\nАпісаньне якое Вы дадалі ня зьявіцца на старонцы апісаньня.\nКаб яно там зьявілася, Вам трэба рэдагаваць яе самастойна.\n[[$1|thumb]]",
- "fileexists-extension": "Файл з падобнай назвай Ñ\83жо Ñ\96Ñ\81нÑ\83е: [[$2|thumb]]\n* Ð\9dазва загÑ\80Ñ\83жанага Ñ\84айла: <strong>[[:$1]]</strong>\n* Ð\9dазва Ñ\96Ñ\81нÑ\83Ñ\8eÑ\87ага Ñ\84айла: <strong>[[:$2]]</strong>\nÐ\9aалÑ\96 лаÑ\81ка, вÑ\8bбÑ\8fÑ\80Ñ\8bÑ\86е Ñ\96нÑ\88Ñ\83Ñ\8e назвÑ\83.",
+ "fileexists-extension": "Файл з падобнай назвай Ñ\83жо Ñ\96Ñ\81нÑ\83е: [[$2|thumb]]\n* Ð\9dазва загÑ\80Ñ\83жанага Ñ\84айла: <strong>[[:$1]]</strong>\n* Ð\9dазва Ñ\96Ñ\81нÑ\83Ñ\8eÑ\87ага Ñ\84айла: <strong>[[:$2]]</strong>\nÐ\9cагÑ\87Ñ\8bма, вÑ\8b жадаеÑ\86е вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82аÑ\86Ñ\8c адÑ\80ознÑ\83Ñ\8e назвÑ\83?",
"fileexists-thumbnail-yes": "Верагодна файл зьяўляецца паменшанай копіяй ''(мініятурай)''. [[$1|thumb]]\nКалі ласка, праверце файл <strong>[[:$1]]</strong>.\nКалі правераны файл зьяўляецца той жа выявай, то загрузка мініятуры ня мае сэнсу.",
"file-thumbnail-no": "Назва файла пачынаецца з <strong>$1</strong>.\nВерагодна гэта паменшаная копія выявы ''(мініятура)''.\nКалі Вы маеце гэтую выяву ў поўным памеры, загрузіце яе, альбо зьмяніце назву файла.",
"fileexists-forbidden": "Файл з такой назвай ужо існуе і ня можа быць перапісаны.\nКалі ласка, вярніцеся назад і загрузіце гэты файл з новай назвай. [[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "Выдаленьне і аднаўленьне файлаў часова забароненае па прычыне падтрымкі.",
"filedelete-maintenance-title": "Немагчыма выдаліць файл",
"mimesearch": "Пошук па MIME",
- "mimesearch-summary": "Гэта старонка дазваляе адбор файлаў па іх MIME-тыпе.\nФармат уводу: тып_зьместу/падтып, напрыклад, <code>image/jpeg</code>.",
+ "mimesearch-summary": "Гэта старонка дазваляе адбор файлаў па іх MIME-тыпе.\nФармат уводу: тып_зьместу/падтып або тып_зьместу/*, напрыклад, <code>image/jpeg</code>.",
"mimetype": "Тып MIME:",
"download": "загрузіць",
"unwatchedpages": "Старонкі, за якімі ніхто не назірае",
"pageinfo-category-pages": "Колькасьць старонак",
"pageinfo-category-subcats": "Колькасьць падкатэгорыяў",
"pageinfo-category-files": "Колькасьць файлаў",
- "skinname-monobook": "Монакніга",
- "skinname-vector": "Вэктар",
"markaspatrolleddiff": "Пазначыць як «патруляваную»",
"markaspatrolledtext": "Пазначыць гэтую старонку як «патруляваную»",
"markedaspatrolled": "Пазначаная як «патруляваная»",
"qbmyoptions": "Свае старонкі",
"faq": "ЧАПЫ",
"faqpage": "Project:ЧАПЫ",
- "vector-action-addsection": "Дадаць тэму",
- "vector-action-delete": "Сцерці",
- "vector-action-move": "Перанесці",
- "vector-action-protect": "Ахова",
- "vector-action-undelete": "Аднавіць",
- "vector-action-unprotect": "Змяніць ахову",
- "vector-view-create": "Стварыць",
- "vector-view-edit": "Правіць",
- "vector-view-history": "Паказаць гісторыю",
- "vector-view-view": "Чытаць",
- "vector-view-viewsource": "Паказаць зыходны тэкст",
"actions": "Дзеянні",
- "vector-more-actions": "Яшчэ",
"namespaces": "Прасторы імёнаў",
"variants": "Варыянты",
"navigation-heading": "Навігацыя",
"toc": "Змест",
"showtoc": "паказаць",
"hidetoc": "не паказваць",
- "collapsible-collapse": "схаваць",
+ "collapsible-collapse": "Схаваць",
"collapsible-expand": "Паказаць",
"thisisdeleted": "Паказаць ці аднавіць $1?",
"viewdeleted": "Ці паказаць $1?",
"histlegend": "Выбар розніцы: адзначце радыё-боксы версій, якія трэба параўнаць і націсніце enter або кнопку, што ўнізе.<br /> Тлумачэнне: (з актуальн.) = розніца з актуальнай версіяй, (з папярэд.) = розніца з папярэдняй версіяй, д = дробная праўка.",
"history-fieldset-title": "Прагляд гісторыі",
"history-show-deleted": "Толькі выдаленыя",
- "histfirst": "найстарэйшая",
- "histlast": "найноўшая",
+ "histfirst": "найстарэйшыя",
+ "histlast": "найноўшыя",
"historysize": "({{PLURAL:$1|1 байт|$1 байты|$1 байтаў}})",
"historyempty": "(пуста)",
"history-feed-title": "Гісторыя версій",
"diff-multi-manyusers": "({{PLURAL:$1|не паказана $1 прамежкавая версія|не паказаны $1 прамежкавыя версіі|не паказаны $1 прамежкавых версій}}, зробленыя больш чым {{PLURAL:$2|$1 удзельнікам|$2 удзельнікамі}})",
"searchresults": "Вынікі пошуку",
"searchresults-title": "Вынікі пошуку «$1»",
- "toomanymatches": "Знойдзена занадта шмат адпаведнасцяў, паспрабуйце змяніць шуканае.",
"titlematches": "Знойдзена ў назвах",
"textmatches": "Знойдзена ў тэкстах",
"notextmatches": "Нічога не знойдзена ў тэкстах старонак",
"recentchanges-summary": "Гэта апошнія змены на пляцоўцы {{SITENAME}}.",
"recentchanges-noresult": "Няма зменаў за дадзены перыяд, якія адпавядаюць гэтым крытэрыям.",
"recentchanges-feed-description": "Сачыць за найбольш актуальнымі змяненнямі ў віксе праз гэты струмень навін.",
- "recentchanges-label-newpage": "Ð\93Ñ\8dÑ\82ай пÑ\80аÑ\9eкай бÑ\8bла Ñ\81творана новая старонка",
- "recentchanges-label-minor": "Ð\93Ñ\8dÑ\82а дробная па значэнні праўка",
- "recentchanges-label-bot": "Ð\9fÑ\80аÑ\9eка бÑ\8bла зÑ\80обленаÑ\8f праграмай-робатам",
+ "recentchanges-label-newpage": "Створана новая старонка",
+ "recentchanges-label-minor": "Ð\94робная па значэнні праўка",
+ "recentchanges-label-bot": "Ð\9fÑ\80аÑ\9eка зÑ\80облена праграмай-робатам",
"recentchanges-label-unpatrolled": "Праўка яшчэ не атрымала адзнакі ўхваленасці (за ёй не сочыць \"патруль\")",
"recentchanges-label-plusminus": "Аб'ём старонкі змяніўся на гэтую лічбу байтаў",
"recentchanges-legend-heading": "'''Легенда:'''",
- "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (гл. таксама [[Special:NewPages|спіс новых старонак]])",
+ "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (гл. асобна [[Special:NewPages|новыя старонкі]])",
"rcnotefrom": "Ніжэй знаходзяцца змены з <b>$2</b> (паказана не больш чым <b>$1</b>).",
"rclistfrom": "Паказаць змены з $3 $2",
"rcshowhideminor": "$1 дробныя праўкі",
"largefileserver": "Гэты файл большага аб'ёму, чым дазваляе канфігурацыя сервера.",
"emptyfile": "Здаецца, што файл, укладзены вамі, пусты. Магчыма, здарылася памылка ў назве файла? Праверце, ці вы сапраўды хацелі ўкласці менавіта гэты файл.",
"windows-nonascii-filename": "Дадзеная вікі не падтрымлівае імёны файлаў са спецыяльнымі знакамі.",
- "fileexists": "Ужо Ñ\96Ñ\81нÑ\83е Ñ\84айл з Ñ\82акоÑ\8e назвай, праверце <strong>[[:$1]]</strong>, калі не ўпэўнены, што жадаеце мяняць яго змесціва.\n[[$1|thumb]]",
+ "fileexists": "Ужо Ñ\91Ñ\81Ñ\86Ñ\8c Ñ\84айл з Ñ\82акой назвай, праверце <strong>[[:$1]]</strong>, калі не ўпэўнены, што жадаеце мяняць яго змесціва.\n[[$1|thumb]]",
"filepageexists": "Для файла з такой назвай існуе старонка апісання <strong>[[:$1]]</strong>, але сам файл зараз не існуе.\nТаму вашае апісанне не з'явіцца на адпаведнай старонцы, пакуль вы самастойна яе не паправіце.\n[[$1|thumb]]",
"fileexists-extension": "Ужо ёсць файл з падобнай назвай: [[$2|thumb]]\n* Назва ўкладанага файла: <strong>[[:$1]]</strong>\n* Назва наяўнага файла: <strong>[[:$2]]</strong>\nВыберыце іншую назву.",
"fileexists-thumbnail-yes": "Файл падобны на выяву скарочанага памеру ''(драбніца)''. [[$1|thumb]]\nПраверце файл <strong>[[:$1]]</strong>.\nКалі правераны файл мае змест і памеры, аднолькавыя з гэтым, то дадатковае ўкладанне драбніцы непатрэбнае.",
"backend-fail-internal": "Узнікла невядомая памылка на серверы сховішча «$1».",
"backend-fail-contenttype": "Немагчыма вызначыць тып зместу файла, які мусіць быць захаваны ў «$1».",
"backend-fail-batchsize": "Сервер сховішча атрымаў блок з $1 {{PLURAL:$1|файлавай аперацыі|файлавых аперацый|файлавых аперацый}}; абмежаванне складае $2",
+ "backend-fail-usable": "Немагчыма прачытаць ці запісаць файл \"$1\" з-за нястачы дазволаў ці адсутнасці каталогаў/кантэйнераў.",
+ "filejournal-fail-dbconnect": "Немагчыма далучыцца да базы звестак журнала для рухавіка захоўвання дадзеных \"$1\".",
+ "filejournal-fail-dbquery": "Немагчыма абнавіць базу звестак журнала для рухавіка захоўвання дадзеных \"$1\".",
"lockmanager-notlocked": "Не ўдалося разблакаваць \"$1\"; ён не заблакаваны.",
"lockmanager-fail-closelock": "Не ўдалося закрыць файл блакіроўкі для «$1».",
"lockmanager-fail-deletelock": "Не ўдалося выдаліць файл блакіроўкі для «$1».",
"uploadstash-refresh": "Абнавіць спіс файлаў",
"invalid-chunk-offset": "Недапушчальнае зрушэнне фрагмента",
"img-auth-accessdenied": "Доступ забаронены",
- "img-auth-nopathinfo": "Адсутнічае PATH_INFO",
+ "img-auth-nopathinfo": "Адсутнічае PATH_INFO.\nВаш сервер не настроены на перадачу гэтых звестак.\nМагчыма, ён на аснове CGI і не падтрымлівае img_auth.\nГл. https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
"img-auth-notindir": "Запытаны шлях не ставіцца да наладжанага каталога ўкладанняў.",
"img-auth-badtitle": "Немагчыма пабудаваць правільны загаловак з «$1».",
"img-auth-nologinnWL": "Вы не ўвайшлі ў сістэму, а «$1» не ўваходзіць ў белы спіс.",
"listfiles_size": "Памер у байтах",
"listfiles_description": "Апісанне",
"listfiles_count": "Версіі",
+ "listfiles-show-all": "Уключыць старыя версіі відарысаў",
+ "listfiles-latestversion": "Актуальная версія",
+ "listfiles-latestversion-yes": "Так",
+ "listfiles-latestversion-no": "Не",
"file-anchor-link": "Файл",
"filehist": "Гісторыя файла",
"filehist-help": "Націснуць на даце з часам, каб паказаць файл, якім ён тады быў.",
"sharedupload": "Гэты файл з $1 і можа выкарыстоўвацца іншымі праектамі.",
"sharedupload-desc-there": "Гэты файл з $1 і можа выкарыстоўвацца ў іншых праектах.\nДадатковую інфармацыю можна знайсці на [$2 старонцы апісання файла].",
"sharedupload-desc-here": "Гэты файл з $1 і можа выкарыстоўвацца іншымі праектамі. Апісанне на яго [$2 старонцы размоў] прыведзена ніжэй",
+ "sharedupload-desc-edit": "Гэты файл з $1 і можа выкарыстоўвацца ў іншых праектах.\nМажліва, вы хочаце правіць апісанне на [$2 старонцы апісання файла] там.",
"filepage-nofile": "Не знойдзены файл з такой назвай.",
"filepage-nofile-link": "Не знойдзены файл з такой назвай, але можна [$1 яго ўкласці].",
"uploadnewversion-linktext": "Укласці новую версію гэтага файла",
"shared-repo-from": "з $1",
"shared-repo": "супольнае сховішча",
+ "upload-disallowed-here": "Вы не можаце перапісаць гэты файл.",
"filerevert": "Адкаціць $1",
"filerevert-legend": "Адкат файла",
"filerevert-intro": "Вы адкочваеце '''[[Media:$1|$1]]''' да [$4 версіі з $3, $2].",
"filedelete-maintenance": "Тымчасова адключаныя сціранне і аднаўленне файлаў (на час тэхнічнага абслугоўвання).",
"filedelete-maintenance-title": "Немагчыма сцерці файл",
"mimesearch": "Пошук паводле зместу файла",
- "mimesearch-summary": "Старонка дазваляе прасейваць файлы ў залежнасці ад іх тыпаў MIME. Фармат уводу: contenttype/subtype, напр., <code>image/jpeg</code>.",
+ "mimesearch-summary": "Старонка дазваляе прасейваць файлы ў залежнасці ад іх тыпаў MIME.\nФармат уводу: contenttype/subtype або contenttype/*, напр., <code>image/jpeg</code>.",
"mimetype": "Тып MIME:",
"download": "узяць сабе",
"unwatchedpages": "Старонкі, якія не назіраюцца",
"listredirects": "Усе перасылкі",
+ "listduplicatedfiles": "Пералік дублікатных файлаў",
+ "listduplicatedfiles-summary": "Гэта пералік файлаў, у якіх найноўшая версія файла ўяўляе сабою копію апошняй версіі якога-небудзь іншага файла. Улічваюцца толькі лакальныя файлы.",
+ "listduplicatedfiles-entry": "[[:File:$1|$1]] мае [[$3|{{PLURAL:$2|дублікат|$2 дублікаты|$2 дублікатаў}}]].",
"unusedtemplates": "Шаблоны, якія не выкарыстаны",
"unusedtemplatestext": "Тут пералічаныя ўсе старонкі ў прасторы назваў {{ns:template}}, якія ані разу не ўкладзеныя ў іншыя старонкі. Памятайце, што трэба правяраць спасылкі на шаблоны перад тым, як сціраць іх.",
"unusedtemplateswlh": "іншыя спасылкі",
"randompage": "Выпадковая старонка",
"randompage-nopages": "Няма старонак у наступн{{PLURAL:$2|ай прасторы|ых прасторах}} назваў: $1.",
+ "randomincategory": "Выпадковая старонка ў катэгорыі",
+ "randomincategory-invalidcategory": "\"$1\" - недапушчальная назва катэгорыі.",
+ "randomincategory-nopages": "Няма старонак у катэгорыі [[:Category:$1|$1]].",
+ "randomincategory-selectcategory": "Атрымаць выпадковую старонку з катэгорыі: $1 $2.",
+ "randomincategory-selectcategory-submit": "Перайсці",
"randomredirect": "Выпадковая перасылка",
"randomredirect-nopages": "Няма перасылак у прасторы назваў \"$1\".",
"statistics": "Статыстыка",
"statistics-users-active": "Актыўныя ўдзельнікі",
"statistics-users-active-desc": "Удзельнікі, якія хоць нешта зрабілі за апошн{{PLURAL:$1|і дзень|ія $1 дзён}}",
"statistics-mostpopular": "Самыя папулярныя старонкі",
+ "pageswithprop": "Старонкі з уласцівасцю старонкі",
+ "pageswithprop-legend": "Старонкі з пэўнай уласцівасцю",
+ "pageswithprop-text": "На гэтай старонцы пералічаны старонкі, якія выкарыстоўваюць пэўную уласцівасць.",
+ "pageswithprop-prop": "Назва ўласцівасці:",
+ "pageswithprop-submit": "Перайсці",
+ "pageswithprop-prophidden-long": "доўгае тэкставае значэнне ўласцівасці схавана ($1)",
+ "pageswithprop-prophidden-binary": "двайковае значэнне ўласцівасці схавана ($1)",
"doubleredirects": "Падвойныя перасылкі",
"doubleredirectstext": "Тут пералічаныя старонкі-перасылкі, якія паказваюць на іншыя перасылкі.\nКожны радок утрымлівае спасылкі на першую і другую перасылкі, а таксама мэту другой перасылкі, якая звычайна і ёсць \"сапраўдная\" мэтавая старонка, на якую павінна была паказваць першая перасылка.\n<del>Закрэсленыя складнікі</del> ўжо былі папраўленыя.",
- "double-redirect-fixed-move": "Назва [[$1]] была перанесена, і зараз перасылае да [[$2]]",
- "double-redirect-fixed-maintenance": "Ð\92Ñ\8bпÑ\80аÑ\9eленне падвойнага пеÑ\80анакÑ\96Ñ\80аваннÑ\8f з [[$1]] на [[$2]].",
+ "double-redirect-fixed-move": "Назва [[$1]] была перанесена.\nПасля аўтаматычнага абнаўлення зараз яна перасылае да [[$2]]",
+ "double-redirect-fixed-maintenance": "Ð\90Ñ\9eÑ\82амаÑ\82Ñ\8bÑ\87нае вÑ\8bпÑ\80аÑ\9eленне падвойнай пеÑ\80аÑ\81Ñ\8bлкÑ\96 з [[$1]] на [[$2]] Ñ\86Ñ\8fгам Ñ\82Ñ\8dÑ\85нÑ\96Ñ\87нага абÑ\81лÑ\83гоÑ\9eваннÑ\8f.",
"double-redirect-fixer": "Выпраўляльнік перасылак",
"brokenredirects": "Паламаныя перасылкі",
"brokenredirectstext": "Гэтыя перасылкі паказваюць на старонкі, якіх няма:",
"fewestrevisions": "Артыкулы з найменшай колькасцю версій",
"nbytes": "$1 {{PLURAL:$1|байт|байта|байтаў}}",
"ncategories": "$1 {{PLURAL:$1|катэгорыя|катэгорыі|катэгорый}}",
+ "ninterwikis": "$1 {{PLURAL:$1|інтэрвікі|інтэрвікі}}",
"nlinks": "$1 {{PLURAL:$1|спасылка|спасылкі|спасылак}}",
"nmembers": "$1 {{PLURAL:$1|складнік|складнікі|складнікаў}}",
+ "nmemberschanged": "$1 → $2 {{PLURAL:$2|складнік|складнікі|складнік}}",
"nrevisions": "$1 {{PLURAL:$1|версія|версіі|версій}}",
"nviews": "$1 {{PLURAL:$1|паказ|паказаў}}",
"nimagelinks": "Выкарыстоўваецца на $1 {{PLURAL:$1|старонцы|старонках|старонках}}",
"mostlinkedtemplates": "Шаблоны ў частым выкарыстанні",
"mostcategories": "Артыкулы ў найбольшай кольк. катэгорый",
"mostimages": "Выявы ў частым выкарыстанні",
+ "mostinterwikis": "Артыкулы з найбольш. кольк. інтэрвкікі",
"mostrevisions": "Артыкулы з найбольшай колькасцю версій",
"prefixindex": "Старонкі з назвамі на ўзор",
"prefixindex-namespace": "Усе старонкі з прэфіксам ( $1 прастора імёнаў)",
+ "prefixindex-strip": "Прыбраць прэфікс у пераліку",
"shortpages": "Старонкі малога аб'ёму",
"longpages": "Старонкі вялікага аб'ёму",
"deadendpages": "Старонкі без спасылак",
"deadendpagestext": "Спіс старонак без спасылак на тутэйшыя артыкулы.",
"protectedpages": "Старонкі пад аховай",
"protectedpages-indef": "Толькі бестэрміновыя аховы",
+ "protectedpages-summary": "На гэтай старонцы пералічаны наяўныя старонкі, якія зараз знаходзяцца пад аховай. Спіс назваў, абароненых ад стварэння, гл. [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
"protectedpages-cascade": "Толькі каскадныя засцераганні",
"protectedpages-noredirect": "Схаваць перанакіраванні",
"protectedpagesempty": "Ніякія старонкі такім чынам не ахоўваюцца.",
+ "protectedpages-timestamp": "Дата/час",
"protectedpages-page": "Старонка",
"protectedpages-expiry": "Канчаецца",
"protectedpages-performer": "Паставіў ахову",
"protectedpages-unknown-timestamp": "Невядома",
"protectedpages-unknown-performer": "Нявызначаны ўдзельнік",
"protectedtitles": "Назвы пад аховай",
+ "protectedtitles-summary": "На гэтай старонцы пералічаны назвы, якія зараз абаронены ад стварэння. Спіс існых старонак пад аховай гл. [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
"protectedtitlesempty": "Няма назваў, якія зараз бы ахоўваліся з такімі параметрамі.",
"listusers": "Усе ўдзельнікі",
"listusers-editsonly": "Толькі ўдзельнікі, якія маюць праўкі",
"allpagesbadtitle": "Гэтая назва старонкі недапушчальная або ўтрымлівае між-моўны або між-вікавы прэфікс. Магчыма, у назве ёсць знак ці знакі, якія нельга ўжываць у назвах.",
"allpages-bad-ns": "На {{SITENAME}} прастора назваў \"$1\" не падтрымліваецца.",
"allpages-hide-redirects": "Схаваць перанакіраванні",
+ "cachedspecial-viewing-cached-ttl": "Вы праглядаеце кэшаваную версію старонкі, даўнасць якой можа быць $1.",
+ "cachedspecial-viewing-cached-ts": "Вы праглядаеце кэшаваную версію старонкі, якая можа быць не зусім актуальнай.",
+ "cachedspecial-refresh-now": "Глядзець найноўшую.",
"categories": "Катэгорыі",
"categoriespagetext": "Наступн{{PLURAL:$1|ая катэгорыя ўтрымлівае|ыя $1 катэгорыі(-й) утрымліваюць}} старонкі або мультымедыю.\nТут не паказаныя [[Special:UnusedCategories|катэгорыі без складнікаў]].\nГл. таксама [[Special:WantedCategories|патрэбныя катэгорыі]].",
"categoriesfrom": "Паказаць катэгорыі, пачынаючы з:",
"linksearch-pat": "Што шукаецца:",
"linksearch-ns": "Прастора назваў:",
"linksearch-ok": "Знайсці",
- "linksearch-text": "Ð\9cожна вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваÑ\86Ñ\8c падÑ\81Ñ\82аноÑ\9eнÑ\8bÑ\8f Ñ\81Ñ\96мвалÑ\8b, напÑ\80Ñ\8bклад, <code>*.wikipedia.org</code>.\nÐ\9dеабÑ\85одзен пÑ\80Ñ\8bнамÑ\81Ñ\96 дамен веÑ\80Ñ\85нÑ\8fга Ñ\9eзÑ\80оÑ\9eнÑ\8f, напÑ\80Ñ\8bклад <code>*.org</code><br />\nÐ\9fÑ\80аÑ\82аколÑ\8b, Ñ\8fкÑ\96Ñ\8f падÑ\82Ñ\80Ñ\8bмлÑ\96ваÑ\8eÑ\86Ñ\86а: <code>$1</code> (не дадаваÑ\86Ñ\8c лÑ\8eбÑ\8b з Ñ\96Ñ\85 Ñ\83 ваÑ\88Ñ\8bм поÑ\88Ñ\83кÑ\83)",
+ "linksearch-text": "Ð\9cожна вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваÑ\86Ñ\8c падÑ\81Ñ\82аноÑ\9eнÑ\8bÑ\8f Ñ\81Ñ\96мвалÑ\8b, напÑ\80Ñ\8bклад, <code>*.wikipedia.org</code>.\nÐ\9dеабÑ\85одзен пÑ\80Ñ\8bнамÑ\81Ñ\96 дамен веÑ\80Ñ\85нÑ\8fга Ñ\9eзÑ\80оÑ\9eнÑ\8e, напÑ\80Ñ\8bклад <code>*.org</code><br />\n{{PLURAL:$2|Ð\9fÑ\80аÑ\82акол|Ð\9fÑ\80аÑ\82аколÑ\8b}}, Ñ\8fкÑ\96Ñ\8f падÑ\82Ñ\80Ñ\8bмлÑ\96ваÑ\8eÑ\86Ñ\86а: <code>$1</code> (пÑ\80адвÑ\8bзнаÑ\87анÑ\8b http:// калÑ\96 пÑ\80аÑ\82акол не Ñ\9eказанÑ\8b)",
"linksearch-line": "$1, на які спасылаецца $2",
"linksearch-error": "Узоры можна ставіць толькі ў пачатак адрасу.",
"listusersfrom": "Паказаць удзельнікаў, пачаўшы з:",
"listusers-blocked": "(заблакаваны)",
"activeusers": "Актыўныя ўдзельнікі",
"activeusers-intro": "Гэта пералік удзельнікаў, якія нешта рабілі за апошнія $1 {{PLURAL:$1|дзень|дзён}}.",
- "activeusers-count": "$1 {{PLURAL:$1|пÑ\80аÑ\9eка|пÑ\80аÑ\9eкÑ\96|пÑ\80авак}} за апоÑ\88нÑ\96{{PLURAL:$3| дзенÑ\8c|я $3 дзён}}",
+ "activeusers-count": "$1 {{PLURAL:$1|дзеÑ\8fнне|дзеÑ\8fннÑ\96|дзеÑ\8fннÑ\8fÑ\9e}} за апоÑ\88нÑ\96{{PLURAL:$3| дзенÑ\8c|Ñ\8f $3 днÑ\96|я $3 дзён}}",
"activeusers-from": "Паказ, пачынаючы з:",
"activeusers-hidebots": "Без робатаў",
"activeusers-hidesysops": "Без адміністратараў",
"activeusers-noresult": "Няма такіх удзельнікаў.",
"listgrouprights": "Дазволы для груп удзельнікаў",
"listgrouprights-summary": "Гэты пералік вызначаных у гэтай вікі груп удзельнікаў, разам з прыпісанымі ім дазволамі.\nДаведацца больш пра асабістыя дазволы можна на старонцы [[{{MediaWiki:Listgrouprights-helppage}}]].",
- "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Дадзены правы</span>\n* <span class=\"listgrouprights-revoked\">Адкліканыя правы</span>",
+ "listgrouprights-key": "Легенда:\n* <span class=\"listgrouprights-granted\">Дадзены дазвол</span>\n* <span class=\"listgrouprights-revoked\">Адкліканы дазвол</span>",
"listgrouprights-group": "Група",
"listgrouprights-rights": "Дазволы",
"listgrouprights-helppage": "Help:Дазволы ў групах",
"listgrouprights-removegroup-self": "можа выдаліць {{PLURAL:$2|групу|групы}} са свайго ўліковага запісу: $1",
"listgrouprights-addgroup-self-all": "Дадаць усе групы да свайго акаунта",
"listgrouprights-removegroup-self-all": "Выдаліць усе групы са свайго акаунта",
+ "listgrouprights-namespaceprotection-header": "Абмежаванні прасторы назваў",
"listgrouprights-namespaceprotection-namespace": "Прастора назваў",
+ "listgrouprights-namespaceprotection-restrictedto": "Дазвол(ы), неабходныя для праўкі",
+ "trackingcategories": "Катэгорыі адсочвання",
+ "trackingcategories-name": "Назва паведамлення",
+ "trackingcategories-desc": "Крытэрый уключэння ў катэгорыю",
"trackingcategories-nodesc": "Апісанне адсутнічае.",
+ "trackingcategories-disabled": "Катэгорыя адключана",
"mailnologin": "Няма эл.адрасу",
"mailnologintext": "Трэба [[Special:UserLogin|ўвайсці ў сістэму]] і мець пацверджаны адрас эл.пошты ў сваіх [[Special:Preferences|настáўленнях]], каб слаць эл.пошту іншым удзельнікам.",
"emailuser": "Эл.пошта ўдзельніка",
+ "emailuser-title-target": "Напісаць ліст {{GENDER:$1|удзельніку|удзельніцы}}",
"emailuser-title-notarget": "Напісанне электроннага ліста ўдзельніку",
"emailpage": "Зварот да ўдзельніка праз эл.пошту",
"emailpagetext": "Тут можна выслаць эл.пошту гэта{{GENDER:$1|му ўдзельніку|й удзельніцы}}.\nАдрас эл.пошты, уведзены вамі ў [[Special:Preferences|сваіх настройках]], з'явіцца ў полі \"Ад каго (From)\" вашага ліста, і атрымальнік зможа адказаць на ваш ліст.",
"watchlistanontext": "Каб паглядзець ці змяніць спіс назірання, трэба $1.",
"watchnologin": "Без прадстаўлення",
"addwatch": "Дадаць у спіс назірання",
- "addedwatchtext": "Старонка \"[[:$1]]\" была дададзена да [[Special:Watchlist|назіраных]] вамі.\nЗмяненні, якія адбудуцца з гэтай старонкай і з Размовай пра яе, будуць паказвацца там, і старонка будзе '''вылучацца шрыфтам''' у [[Special:RecentChanges|спісе нядаўніх змяненняў]], каб лягчэй пазнаваць яе.\n\nКалі вы не пажадаеце больш назіраць за гэтай старонкай, націсніце \"Не назіраць\" у бакоўцы.",
+ "addedwatchtext": "Старонка \"[[:$1]]\" была дададзена да [[Special:Watchlist|назіраных]] вамі.\nЗмяненні, якія адбудуцца з гэтай старонкай і з размовамі пра яе, будуць паказвацца ў спісе назірання.",
"addedwatchtext-short": "Старонка \"$1\" была дададзена ў ваш спіс назірання.",
"removewatch": "Выдаліць са спіса назірання",
"removedwatchtext": "Старонка \"[[:$1]]\" была вынята з вашага [[Special:Watchlist|спіса назірання]].",
"enotif_reset": "Пазначыць усе старонкі як наведаныя",
"enotif_impersonal_salutation": "Шаноўны ўдзельнік {{SITENAME}}",
"enotif_subject_deleted": "Старонка $1 праекта {{SITENAME}} сцёрта {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2",
+ "enotif_subject_created": "Старонка $1 праекта {{SITENAME}} створана {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2",
+ "enotif_subject_moved": "Старонка $1 праекта {{SITENAME}} перанесена {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2",
+ "enotif_subject_restored": "Старонка $1 праекта {{SITENAME}} адноўлена {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2",
+ "enotif_subject_changed": "Старонка $1 праекта {{SITENAME}} зменена {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2",
+ "enotif_body_intro_deleted": "Старонка $1 праекта {{SITENAME}} сцёрта {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2 $PAGEEDITDATE, гл. $3.",
+ "enotif_body_intro_created": "Старонка $1 праекта {{SITENAME}} створана {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2 $PAGEEDITDATE, гл. актуальную версію $3.",
+ "enotif_body_intro_moved": "Старонка $1 праекта {{SITENAME}} перанесена {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2 $PAGEEDITDATE, гл. актуальную версію $3.",
+ "enotif_body_intro_restored": "Старонка $1 праекта {{SITENAME}} адноўлена {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2 $PAGEEDITDATE, гл. актуальную версію $3.",
+ "enotif_body_intro_changed": "Старонка $1 праекта {{SITENAME}} зменена {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2 $PAGEEDITDATE, гл. актуальную версію $3.",
"enotif_lastvisited": "Гл. $1 каб бачыць усе змены пасля вашага апошняга наведвання.",
"enotif_lastdiff": "Гл. $1 каб бачыць гэтую мену.",
"enotif_anon_editor": "ананімны ўдзельнік $1",
- "enotif_body": "Паважаны(ая) $WATCHINGUSERNAME,\n\n$PAGEEDITDATE старонка праекту «{{SITENAME}}» $PAGETITLE была $CHANGEDORCREATED удзельнікам $PAGEEDITOR, гл. $PAGETITLE_URL для прагляду бягучай версіі.\n\n$NEWPAGE\n\nКароткае апісанне змены: $PAGESUMMARY $PAGEMINOREDIT\n\nЗвярнуцца да змяніўшага:\nэл. пошта: $PAGEEDITOR_EMAIL\nвікі: $PAGEEDITOR_WIKI\n\nКалі вы не наведаеце гэтую старонку, то ў выпадку яе далейшых змен апавяшчэнняў больш не будзе.\nВы можаце таксама адключыць опцыю паведамлення для ўсіх старонак у вашым спісе назірання.\n\n Сістэма апавяшчэння {{grammar:genitive|{{SITENAME}}}}\n\n--\nЗмена наладаў апавяшчэнняў\n{{canonicalurl:{{#special:Preferences}}}}\n\nЗмена наладаў вашага спісу назіранняў\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nВыдаліць старонкі з вашага спісу назіранага\n$UNWATCHURL\n\nЗваротная сувязь і дапамога\n$HELPPAGE",
+ "enotif_body": "Паважаны(ая) $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nКароткае апісанне змены: $PAGESUMMARY $PAGEMINOREDIT\n\nЗвярнуцца да змяніўшага:\nэл. пошта: $PAGEEDITOR_EMAIL\nвікі: $PAGEEDITOR_WIKI\n\nКалі вы не наведаеце гэтую старонку, прадставіўшыся сістэме, у выпадку далейшай актыўнасці апавяшчэнняў больш не будзе. Вы можаце таксама адключыць опцыю паведамлення для ўсіх старонак у вашым спісе назірання.\n\nСістэма апавяшчэння {{grammar:genitive|{{SITENAME}}}}\n\n--\nЗмена настроек апавяшчэння\n{{canonicalurl:{{#special:Preferences}}}}\n\nЗмена наладаў вашага спісу назірання\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nВыдаліць старонку з вашага спісу назірання\n$UNWATCHURL\n\nЗваротная сувязь і дапамога\n$HELPPAGE",
"created": "створана",
"changed": "зменена",
"deletepage": "Сцерці старонку",
"deletecomment": "Прычына:",
"deleteotherreason": "Іншы/дадатковы повад:",
"deletereasonotherlist": "Іншы повад",
- "deletereason-dropdown": "*Ð\97вÑ\8bÑ\87айнÑ\8bÑ\8f пÑ\80Ñ\8bÑ\87Ñ\8bнÑ\8b Ñ\81Ñ\86Ñ\96Ñ\80аннÑ\8f\n** Ð\96аданне аÑ\9eÑ\82аÑ\80а Ñ\82Ñ\8dкÑ\81Ñ\82Ñ\83\n** Ð\9fаÑ\80Ñ\83Ñ\88Ñ\8dнне аÑ\9eÑ\82аÑ\80Ñ\81кага пÑ\80ава\n** Ð\92андалÑ\96зм",
+ "deletereason-dropdown": "*Ð\97вÑ\8bÑ\87айнÑ\8bÑ\8f пÑ\80Ñ\8bÑ\87Ñ\8bнÑ\8b Ñ\81Ñ\86Ñ\96Ñ\80аннÑ\8f\n** Спам\n** Ð\92андалÑ\96зм\n** Ð\9fаÑ\80Ñ\83Ñ\88Ñ\8dнне аÑ\9eÑ\82аÑ\80Ñ\81кага пÑ\80ава\n** Ð\96аданне аÑ\9eÑ\82аÑ\80а Ñ\82Ñ\8dкÑ\81Ñ\82Ñ\83\n** Ð\9dÑ\8fÑ\81лÑ\83Ñ\88наÑ\8f пеÑ\80аÑ\81Ñ\8bлка",
"delete-edit-reasonlist": "Правіць прычыны сцірання",
"delete-toobig": "Старонка мае вялікую гісторыю правак, больш за $1 {{PLURAL:$1|версію|версій}}. Сціранне такіх старонак было абмежавана, каб пазбегчы ўтварэння выпадковых перашкод працы {{SITENAME}}.",
"delete-warning-toobig": "Старонка мае вялікую гісторыю правак, больш за $1 {{PLURAL:$1|версію|версій}}. Сціранне такіх старонак можа перашкодзіць працы базы даных {{SITENAME}}; будзьце асцярожнымі.",
+ "deleting-backlinks-warning": "'''Увага:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Іншыя старонкі]] спасылаюцца на ці ўключаюць старонку, якую вы збіраецеся сцерці.",
"rollback": "Адкаціць праўкі",
"rollback_short": "Адкат",
"rollbacklink": "адкат",
+ "rollbacklinkcount": "адкаціць $1 {{PLURAL:$1|праўку|праўкі|правак}}",
"rollbacklinkcount-morethan": "адкаціць больш за $1 {{PLURAL:$1|праўку|праўкі|правак}}",
"rollbackfailed": "Не ўдалося адкаціць",
"cantrollback": "Немагчыма адкаціць праўку; апошні аўтар гэта адзіны аўтар на гэтай старонцы.",
"alreadyrolled": "Немагчыма адкаціць апошнюю праўку ў [[:$1]], аўтарства [[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nз таго часу нехта іншы правіў або адкатваў гэтую старонку.\n\nАпошняя праўка старонкі была аўтарства [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
"editcomment": "Тлумачэнне праўкі было: \"''$1''\".",
"revertpage": "Праўкі аўтарства [[Special:Contributions/$2|$2]] ([[User talk:$2|размова]]) адкочаныя; вернута апошняя версія аўтарства [[User:$1|$1]]",
- "revertpage-nouser": "Праўкі (імя ўдзельніка выдалена) адкочаны да версіі [[User:$1|$1]]",
+ "revertpage-nouser": "Праўкі (імя ўдзельніка схавана) адкочаны да версіі {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Адкочаны праўкі $1; вернута апошняя версія $2.",
"sessionfailure-title": "Памылка сеансу",
"sessionfailure": "Магчыма, ёсць праблемы з вашым сеансам працы ў сістэме. Таму вам было адмоўлена ў выкананні дзеяння, каб засцерагчыся ад захопу сеанса. Націсніце \"Назад\", і перачытайце старонку, з якой вы сюды прыйшлі, тады паспрабуйце нанова.",
"prot_1movedto2": "[[$1]] перанесена ў [[$2]]",
"protect-badnamespace-title": "Прастора імёнаў без аховы",
"protect-badnamespace-text": "Старонкі ў гэтай прасторы імёнаў не могуць знаходзіцца пад аховай.",
+ "protect-norestrictiontypes-text": "Старонка не можа ахоўвацца, таму што недаступны тыпы абмежавання.",
"protect-legend": "Пацверджанне пачатку аховы",
"protectcomment": "Прычына:",
"protectexpiry": "Канчаецца:",
"undeletedrevisions": "Адноўлен{{PLURAL:$1|а 1 версія|ы $1 версіі|ы $1 версій}}",
"undeletedrevisions-files": "Адноўлен{{PLURAL:$1|а 1 версія|ы $1 версіі|ыя $1 версій}} і {{PLURAL:$2|1 файл|$2 файлы|$2 файлаў}}",
"undeletedfiles": "Адноўлен{{PLURAL:$1|ы 1 файл|ы $1 файлы|ыя $1 файлаў}}",
- "cannotundelete": "Не ўдалося аднавіць; магчыма, нехта іншы ўжо аднавіў старонку.",
+ "cannotundelete": "Не ўдалося аднавіць:\n$1",
"undeletedpage": "'''$1 была адноўлена'''\n\nПраверце пералік нядаўніх сціранняў і аднаўленняў у [[Special:Log/delete|журнале сціранняў]].",
"undelete-header": "Нядаўна сцёртыя старонкі можна паглядзець у [[Special:Log/delete|журнале сціранняў]].",
"undelete-search-title": "Шукаць у сцёртых старонках",
"contributions-title": "Уклад {{GENDER:$1|удзельніка|удзельніцы}} $1",
"mycontris": "Уклад",
"contribsub2": "Для $1 ($2)",
+ "contributions-userdoesnotexist": "Уліковы запіс удзельніка \"$1\" не зарэгістраваны.",
"nocontribs": "Не знойдзена змен, адпаведных зададзеным параметрам.",
"uctop": "(апошн.)",
"month": "Ад месяцу (і раней):",
"sp-contributions-newbies-sub": "З новых рахункаў",
"sp-contributions-newbies-title": "Уклады ўдзельнікаў з новых рахункаў",
"sp-contributions-blocklog": "блакіроўкі",
+ "sp-contributions-suppresslog": "заглушаны ўклад удзельніка",
"sp-contributions-deleted": "сцёрты ўклад удзельніка",
"sp-contributions-uploads": "укладанні",
"sp-contributions-logs": "журналы",
"sp-contributions-search": "Знайсці ўклад",
"sp-contributions-username": "Адрас IP або імя ўдзельніка:",
"sp-contributions-toponly": "Паказваць толькі праўкі, якія з'яўляюцца апошнімі версіямі",
+ "sp-contributions-newonly": "Паказваць толькі праўкі, якімі створаны старонкі",
"sp-contributions-submit": "Пошук",
"whatlinkshere": "Сюды спасылаюцца",
"whatlinkshere-title": "Старонкі, якія спасылаюцца на \"$1\"",
"ipb-confirm": "Пацвердзіць блакіроўку",
"badipaddress": "Недапушчальны адрас IP",
"blockipsuccesssub": "Паспяховае блакаванне",
- "blockipsuccesstext": "[[Special:Contributions/$1|$1]] быў заблакаваны.<br />\nБлокі пералічаныя ў [[Special:BlockList|спісе IP-блокаў]].",
+ "blockipsuccesstext": "[[Special:Contributions/$1|$1]] быў заблакаваны.<br />\nБлокі пералічаны ў [[Special:BlockList|спісе блокаў]].",
"ipb-blockingself": "Вы спрабуеце заблакіраваць сябе самога! Вы ўпэўнены, што хочаце гэта зрабіць?",
"ipb-confirmhideuser": "Вы намерваецеся заблакіраваць удзельніка і схаваць яго імя. Яно не будзе адлюстроўвацца ў спісах і журналах. Вы ўпэўнены, што жадаеце гэта зрабіць?",
"ipb-edit-dropdown": "Прычыны пастаноўкі блока",
"blocklog-showsuppresslog": "Гэты ўдзельнік ужо заблакаваны і скрыты. Журнал утойвання прыведзены ніжэй:",
"blocklogentry": "паставіў блок на \"[[$1]]\", з часам трывання $2 $3",
"reblock-logentry": "змененыя настройкі блока для [[$1]] з часам згасання $2 $3",
- "blocklogtext": "Ð\96Ñ\83Ñ\80нал паÑ\81Ñ\82аноÑ\9eкÑ\96 Ñ\96 здÑ\8bманнÑ\8f блокаÑ\9e. Ð\90Ñ\9eÑ\82амаÑ\82Ñ\8bÑ\87на блакаванÑ\8bÑ\8f адÑ\80аÑ\81Ñ\8b IP Ñ\82Ñ\83Ñ\82 не паказваÑ\8eÑ\86Ñ\86а. СпÑ\96Ñ\81 акÑ\82Ñ\83алÑ\8cнÑ\8bÑ\85 забаÑ\80он Ñ\96 блокаÑ\9e баÑ\87 Ñ\83 [[Special:BlockList|Ñ\81пÑ\96Ñ\81е блокаÑ\9e IP]].",
+ "blocklogtext": "Ð\96Ñ\83Ñ\80нал паÑ\81Ñ\82аноÑ\9eкÑ\96 Ñ\96 знÑ\8fÑ\86Ñ\86Ñ\8f блокаÑ\9e. Ð\90Ñ\9eÑ\82амаÑ\82Ñ\8bÑ\87на блакаванÑ\8bÑ\8f адÑ\80аÑ\81Ñ\8b IP Ñ\82Ñ\83Ñ\82 не паказваÑ\8eÑ\86Ñ\86а. СпÑ\96Ñ\81 акÑ\82Ñ\83алÑ\8cнÑ\8bÑ\85 забаÑ\80он Ñ\96 блокаÑ\9e баÑ\87 Ñ\83 [[Special:BlockList|Ñ\81пÑ\96Ñ\81е блокаÑ\9e]].",
"unblocklogentry": "зняты блок з $1",
"block-log-flags-anononly": "толькі ананімныя ўдзельнікі",
"block-log-flags-nocreate": "стварэнне рахунку не дазволена",
"lockedbyandtime": "($1 $2 $3)",
"move-page": "Перанесці $1",
"move-page-legend": "Перанесці старонку",
- "movepagetext": "Форма, што ніжэй, перанясе старонку пад новую назву, і таксама перанясе пад новую назву ўсю гісторыю старонкі.\nСтарая назва ператворыцца ў перасылку да новай.\nПерасылкі, што вялі да старой назвы, можна ўдакладніць аўтаматычна.\nКалі такое аўта-удакладненне не будзе рабіцца, трэба праверыць наяўнасць [[Special:DoubleRedirects|падвойных]] ці [[Special:BrokenRedirects|зламаных]] перасылак.\nАдказнасць за правільную працу спасылак ляжыць на тым, хто пераносіць.\n\nЗаўважце, што старонка '''не будзе''' перанесена, калі пад новай назвай ужо існуе старонка, не пустая і не перасылка і без гісторыі правак. Такім чынам, пры пераносе нельга перапісаць наяўную старонку, а магчымую памылку можна адразу выправіць, пераносячы старонку ў адваротным кірунку.\n\n'''УВАГА!'''\nДля папулярнай старонкі гэта можа стацца рэзкім і нечаканым змяненнем;\nупэўніцеся, што разумееце наступствы пераносу перад тым, як яго зрабіць.",
+ "movepagetext": "Форма, што ніжэй, перанясе старонку пад новую назву, і таксама перанясе пад новую назву ўсю гісторыю старонкі.\nСтарая назва ператворыцца ў перасылку да новай.\nПерасылкі, што вялі да старой назвы, можна ўдакладніць аўтаматычна.\nКалі такое аўта-удакладненне не будзе рабіцца, трэба праверыць наяўнасць [[Special:DoubleRedirects|падвойных]] ці [[Special:BrokenRedirects|зламаных]] перасылак.\nАдказнасць за правільную працу спасылак ляжыць на тым, хто пераносіць.\n\nЗаўважце, што старонка <strong>не будзе</strong> перанесена, калі пад новай назвай ужо існуе старонка, і гэта не перасылка без гісторыі правак.\nТакім чынам, пры пераносе нельга перапісаць наяўную старонку, а магчымую памылку можна адразу выправіць, пераносячы старонку ў адваротным кірунку.\n\n</strong>Увага!</strong>\nДля папулярнай старонкі гэта можа стацца рэзкім і нечаканым змяненнем;\nупэўніцеся, што разумееце наступствы пераносу перад тым, як яго зрабіць.",
"movepagetext-noredirectfixer": "Форма, што ніжэй, перанясе старонку пад новую назву, і таксама перанясе пад новую назву ўсю гісторыю старонкі.\nСтарая назва ператворыцца ў перасылку да новай.\nПерасылкі, што вялі да старой назвы, можна ўдакладніць аўтаматычна.\nКалі такое аўта-удакладненне не будзе рабіцца, трэба праверыць наяўнасць [[Special:DoubleRedirects|падвойных]] ці [[Special:BrokenRedirects|зламаных]] перасылак.\nАдказнасць за правільную працу спасылак ляжыць на тым, хто пераносіць.\n\nЗаўважце, што старонка '''не будзе''' перанесена, калі пад новай назвай ужо існуе старонка, не пустая і не перасылка і без гісторыі правак. Такім чынам, пры пераносе нельга перапісаць наяўную старонку, а магчымую памылку можна адразу выправіць, пераносячы старонку ў адваротным кірунку.\n\n'''УВАГА!'''\nДля папулярнай старонкі гэта можа стацца рэзкім і нечаканым змяненнем;\nупэўніцеся, што разумееце наступствы пераносу перад тым, як яго зрабіць.",
"movepagetalktext": "Звязаная старонка размовы будзе аўтаматычна перанесена разам з асноўнай, '''апроч тых выпадкаў, калі:'''\n*Існуе непустая старонка размовы звязаная з новай назвай, або\n*З боксу, што ніжэй, знятая адзнака.\n\nУ такіх выпадках, калі гэта неабходна, трэба пераносіць або аб'ядноўваць старонку размовы самастойна.",
"movearticle": "Перанесці старонку:",
"importuploaderrortemp": "Не ўдалося атрымаць файл дзеля імпартавання. Няма тымчасовага каталога.",
"import-parse-failure": "Памылка аналізу XML пры імпартаванні",
"import-noarticle": "Няма старонак, каб іх імпартаваць!",
- "import-nonewrevisions": "УÑ\81е веÑ\80Ñ\81Ñ\96Ñ\96 Ñ\9eжо бÑ\8bлÑ\96 Ñ\96мпаÑ\80Ñ\82аванÑ\8bÑ\8f Ñ\80аней.",
+ "import-nonewrevisions": "Ð\9dÑ\96Ñ\87ога не Ñ\96мпаÑ\80Ñ\82авана (Ñ\83Ñ\81е веÑ\80Ñ\81Ñ\96Ñ\96 алÑ\8cбо Ñ\9eжо пÑ\80Ñ\8bÑ\81Ñ\83Ñ\82нÑ\96Ñ\87аÑ\8eÑ\86Ñ\8c, алÑ\8cбо пÑ\80апÑ\83Ñ\88Ñ\87анÑ\8b з-за памÑ\8bлак).",
"xml-error-string": "$1 у радку $2, знак $3 (байт $4): $5",
"import-upload": "Укласці даныя XML",
"import-token-mismatch": "Згублены звесткі пра сеанс. Паспрабуйце ізноў.",
"tooltip-preferences-save": "Захаваць настройкі",
"tooltip-summary": "Дайце кароткае апісанне",
"common.css": "/** CSS, упісаны сюды, будзе дзейнічаць на карыстальнікаў усіх світаў */",
- "monobook.css": "/* CSS, упісаны сюды, будзе дзейнічаць на браўзер кожнага чытача з актыўнай світай Monobook */",
"common.js": "/* Яваскрыпт, упісаны сюды, будзе выконвацца для кожнага чытача, на кожным счытванні старонкі. */",
- "monobook.js": "/* Any JavaScript here will be loaded for users using the MonoBook skin */",
"anonymous": "Ананімны{{PLURAL:$1| ўдзельнік|я ўдзельнікі}} на пляцоўцы {{SITENAME}}",
"siteuser": "удзельнік $1 з {{SITENAME}}",
"anonuser": "ананімны ўдзельнік {{SITENAME}} - $1",
"pageinfo-title": "Інфармацыя для \"$1\"",
"pageinfo-header-basic": "Агульныя звесткі",
"pageinfo-header-edits": "Гісторыя правак",
- "pageinfo-robot-index": "Індэксуюцца",
- "pageinfo-robot-noindex": "Не індэксуюцца",
+ "pageinfo-header-restrictions": "Ахова старонкі",
+ "pageinfo-header-properties": "Уласцівасці старонкі",
+ "pageinfo-display-title": "Паказаная назва",
+ "pageinfo-default-sort": "Прадвызначаны ключ парадкавання",
+ "pageinfo-length": "Даўжыня старонкі (у байтах)",
+ "pageinfo-article-id": "Ідэнтыфікатар старонкі",
+ "pageinfo-language": "Мова змесціва старонкі",
+ "pageinfo-content-model": "Мадэль змесціва старонкі",
+ "pageinfo-robot-policy": "Індэксаванне робатамі",
+ "pageinfo-robot-index": "Дазволена",
+ "pageinfo-robot-noindex": "Не дазволена",
"pageinfo-views": "Колькасць праглядаў",
"pageinfo-watchers": "Колькасць назіральнікаў старонкі",
"pageinfo-few-watchers": "Менш чым $1 {{PLURAL:$1|назіральнік|назіральнікі|назіральнікаў}}",
"pageinfo-redirects-name": "Колькасць перасылак на гэту старонку",
+ "pageinfo-subpages-name": "Колькасць падстаронак гэтай старонкі",
+ "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|перасылка|перасылкі|перасылак}}; $3 {{PLURAL:$3|прамая спасылка|прамыя спасылкі|прамых спасылак}})",
+ "pageinfo-firstuser": "Стваральнік старонкі",
+ "pageinfo-firsttime": "Дата стварэння старонкі",
"pageinfo-lastuser": "Апошні рэдактар",
"pageinfo-lasttime": "Дата апошняй праўкі",
"pageinfo-edits": "Агульная колькасць правак",
"pageinfo-authors": "Агульная колькасць розных аўтараў",
"pageinfo-redirectsto": "Перасылае да",
- "skinname-monobook": "Манабук",
+ "pageinfo-category-info": "Звесткі аб катэгорыі",
+ "pageinfo-category-pages": "Колькасць старонак",
+ "pageinfo-category-subcats": "Колькасць падкатэгорый",
+ "pageinfo-category-files": "Колькасць файлаў",
"markaspatrolleddiff": "Пазначыць як ухваленае",
"markaspatrolledtext": "Пазначыць старонку як ухваленую",
"markedaspatrolled": "Пазначана як ухваленае",
"minutes": "{{PLURAL:$1|$1 хвіліна|$1 хвіліны|$1 хвілін}}",
"hours": "{{PLURAL:$1|$1 гадзіна|$1 гадзіны|$1 гадзін}}",
"days": "{{PLURAL:$1|$1 дзень|$1 дня|$1 дзён}}",
+ "weeks": "{{PLURAL:$1|$1 тыдзень|$1 тыдні|$1 тыдняў}}",
+ "months": "{{PLURAL:$1|$1 месяц|$1 месяцы|$1 месяцаў}}",
+ "years": "{{PLURAL:$1|$1 год|$1 гады|$1 гадоў}}",
"ago": "$1 назад",
+ "just-now": "толькі што",
+ "hours-ago": "$1 {{PLURAL:$1|гадзіну|гадзіны|гадзін}} таму",
+ "minutes-ago": "$1 {{PLURAL:$1|мінуту|мінуты|мінут}} таму",
+ "seconds-ago": "$1 {{PLURAL:$1|секунду|секунды|секундаў}} таму",
"monday-at": "У панядзелак а $1",
"tuesday-at": "У аўторак а $1",
"wednesday-at": "У сераду а $1",
"invalidateemail": "Адмовіцца ад пацверджання эл.пошты",
"scarytranscludedisabled": "[Устаўлянне з іншых вікі не дазволена]",
"scarytranscludefailed": "[Не ўдалося атрымаць шаблон для $1]",
+ "scarytranscludefailed-httpstatus": "[Не ўдалося атрымаць шаблон для $1: HTTP $2]",
"scarytranscludetoolong": "[Занадта доўгі URL]",
"deletedwhileediting": "'''Увага''': гэтая старонка была сцёрта пасля таго, як вы пачалі з ёй працаваць!",
"confirmrecreate": "Удзельнік [[User:$1|$1]] ([[User talk:$1|размова]]) сцёр гэты артыкул пасля таго, як вы пачалі працу з ім, падаўшы прычыну:\n: ''$2''\nПацвердзіце свой намер аднавіць гэты артыкул.",
"confirm-watch-top": "Дабавіць старонку ў спіс назірання",
"confirm-unwatch-button": "ОК",
"confirm-unwatch-top": "Выняць гэту старонку з вашага спіса назірання?",
+ "quotation-marks": "«$1»",
"imgmultipageprev": "← папярэдняя старонка",
"imgmultipagenext": "наступная старонка →",
"imgmultigo": "Пераход!",
"autosumm-replace": "Замена старонкі на '$1'",
"autoredircomment": "Перасылае да [[$1]]",
"autosumm-new": "Новая старонка: '$1'",
- "lag-warn-normal": "Змены, зробленыя менш за $1 {{PLURAL:$1|сек.|сек.}} назад, могуць не трапіць у гэты спіс.",
- "lag-warn-high": "Ð\97 пÑ\80Ñ\8bÑ\87Ñ\8bнÑ\8b моÑ\86нÑ\8bÑ\85 заÑ\82Ñ\80Ñ\8bмак на Ñ\81еÑ\80веÑ\80Ñ\8b баз данÑ\8bÑ\85, зменÑ\8b, зÑ\80обленÑ\8bÑ\8f пазней Ñ\87Ñ\8bм $1 {{PLURAL:$1|Ñ\81ек.|Ñ\81ек.}} назад, могуць не трапіць у гэты спіс.",
+ "lag-warn-normal": "Змены, зробленыя менш за $1 {{PLURAL:$1|сек.|сек.}} таму назад, могуць не трапіць у гэты спіс.",
+ "lag-warn-high": "Ð\97 пÑ\80Ñ\8bÑ\87Ñ\8bнÑ\8b моÑ\86нÑ\8bÑ\85 заÑ\82Ñ\80Ñ\8bмак на Ñ\81еÑ\80веÑ\80Ñ\8b баз звеÑ\81Ñ\82ак, зменÑ\8b, зÑ\80обленÑ\8bÑ\8f менÑ\88 за $1 {{PLURAL:$1|Ñ\81ек.|Ñ\81ек.}} Ñ\82амÑ\83 назад, могуць не трапіць у гэты спіс.",
"watchlistedit-normal-title": "Спіс назірання",
"watchlistedit-normal-legend": "Выдаленне складнікаў са спіса назірання",
"watchlistedit-normal-explain": "Назвы старонак з ліку назіраных паказаныя ніжэй. Каб нешта сцерці, адзначце клетку побач з адпаведным радком, пасля чаго націсніце \"Выняць складнікі\". Таксама можна правіць гэты спіс непасрэдна, [[Special:EditWatchlist/raw|без афармлення]].",
"watchlistedit-raw-done": "Спіс назірання абноўлены.",
"watchlistedit-raw-added": "Дапісаны{{PLURAL:$1| 1 складнік|я $1 складнікаў}}:",
"watchlistedit-raw-removed": "Выняты{{PLURAL:$1| 1 складнік|я $1 складнікаў}}:",
+ "watchlistedit-clear-title": "Чыстка спісу назірання",
"watchlistedit-clear-legend": "Ачысціць спіс назірання",
+ "watchlistedit-clear-explain": "Усе складнікі будуць выняты з вашага спісу назірання",
+ "watchlistedit-clear-titles": "Складнікі:",
+ "watchlistedit-clear-submit": "Ачысціць спіс назірання (адкат будзе немагчымы!)",
"watchlistedit-clear-done": "Ваш спіс назірання ачышчаны.",
+ "watchlistedit-clear-removed": "{{PLURAL:$1|1 складнік выняты|$1 складнікі выняты|$1 складнікаў вынята}}:",
+ "watchlistedit-too-many": "Занадта шмат старонак, каб паказаць тут.",
"watchlisttools-clear": "Ачысціць спіс назірання",
"watchlisttools-view": "Паказаць змяненні",
"watchlisttools-edit": "Паказаць спіс назірання",
"version-hook-name": "Назва хука",
"version-hook-subscribedby": "Сюды падпісаныя",
"version-version": "(Версія $1)",
- "version-license": "Ліцэнзія",
+ "version-no-ext-name": "[без назвы]",
+ "version-license": "Ліцэнзія MediaWiki",
+ "version-ext-license": "Ліцэнзія",
+ "version-ext-colheader-name": "Прыстаўка",
+ "version-ext-colheader-version": "Версія",
+ "version-ext-colheader-license": "Ліцэнзія",
"version-ext-colheader-description": "Апісанне",
"version-ext-colheader-credits": "Аўтары",
"version-license-title": "Ліцэнзія $1",
+ "version-license-not-found": "Не знойдзена падрабязнай інфармацыі аб ліцэнзіі для гэтай прыстаўкі.",
"version-poweredby-credits": "Пляцоўка працуе на '''[https://www.mediawiki.org/ MediaWiki]''', капірайт © 2001-$1 $2.",
"version-poweredby-others": "іншыя",
+ "version-poweredby-translators": "перакладчыкі translatewiki.net",
"version-license-info": "MediaWiki з'яўляецца свабодным праграмным забеспячэннем. Такім чынам, вы можаце паўторна распаўсюджваць прадукт і(або) змяняць яго на ўмовах пагаднення GNU General Public License у тым выглядзе, у якім яно публікуецца фондам Free Software Foundation; сілу мае версія (выпуск) 2 гэтага пагаднення або, на ваш выбар, навейшая версія (выпуск) пагаднення.\n\nMediaWiki распаўсюджваецца, спадзеючыся на прыдатнасць прадукта, але БЕЗ ЯКІХ-НЕБУДЗЬ ГАРАНТЫЙ, у тым ліку, без імплікаваных гарантый СПАЖЫВЕЦКАЙ ВАРТАСЦІ або ПРЫДАТНАСЦІ ДЛЯ ЯКОЙ-НЕБУДЗЬ МЭТЫ. Больш падрабязна гл. пагадненне GNU General Public License.\n\nРазам з гэтым праграмным забеспячэннем вы павінны былі атрымаць [{{SERVER}}{{SCRIPTPATH}}/COPYING копію пагаднення GNU General Public License]. Калі гэта не так, паведамце аб гэтым у фонд Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA або [//www.gnu.org/licenses/old-licenses/gpl-2.0.html атрымайце яе з Інтэрнэту].",
"version-software": "Устаноўленыя праграмныя прадукты",
"version-software-product": "Прадукт",
"version-software-version": "Версія",
"version-entrypoints-header-entrypoint": "Кропка ўваходу",
"version-entrypoints-header-url": "URL",
+ "redirect-legend": "Перасылка да файла ці старонкі",
+ "redirect-submit": "Перайсці",
+ "redirect-lookup": "Шукаць:",
+ "redirect-value": "Значэнне:",
+ "redirect-user": "ID удзельніка:",
+ "redirect-page": "Ідэнтыфікатар старонкі",
+ "redirect-revision": "Версія старонкі",
+ "redirect-file": "Назва файла",
+ "redirect-not-exists": "Значэнне не знойдзена",
"fileduplicatesearch": "Пошук дублікатных файлаў",
"fileduplicatesearch-summary": "Пошук дублікатных файлах на падставе іх хэшаў.",
"fileduplicatesearch-legend": "Знайсці дублікаты",
"specialpages-group-highuse": "Старонкі частага карыстання",
"specialpages-group-pages": "Пералікі старонак",
"specialpages-group-pagetools": "Прылады для старонак",
- "specialpages-group-wiki": "Вікі-даныя і прылады",
+ "specialpages-group-wiki": "Вікізвесткі і прылады",
"specialpages-group-redirects": "Адмысловыя старонкі-перасылкі",
"specialpages-group-spam": "Прылады супраць спама",
"blankpage": "Пустая старонка",
"tags": "Дапушчальныя біркі",
"tag-filter": "Фільтр [[Special:Tags|бірак]]:",
"tag-filter-submit": "Фільтр",
+ "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Тэг|Тэгі}}]]: $2)",
"tags-title": "Біркі",
"tags-intro": "Тут пералічаныя біркі, якімі праграмы могуць пазначыць праўку, а таксама іх значэнні.",
"tags-tag": "Назва біркі",
"tags-display-header": "Назва на паказ",
"tags-description-header": "Поўнае апісанне значэння",
+ "tags-active-header": "Актыўны?",
"tags-hitcount-header": "Пазначаных правак",
+ "tags-active-yes": "Да",
+ "tags-active-no": "Не",
"tags-edit": "правіць",
"tags-hitcount": "$1 {{PLURAL:$1|змена|змены|змен}}",
"comparepages": "Параўнанне старонак",
"dberr-problems": "Прабачце, на пляцоўцы здарыліся тэхнічныя цяжкасці.",
"dberr-again": "Паспрабуйце перачытаць праз некалькі хвілін.",
"dberr-info": "(Немагчыма звязацца з серверам баз даных: $1)",
+ "dberr-info-hidden": "(Немагчыма звязацца з серверам базы звестак)",
"dberr-usegoogle": "Тымчасам можна паспрабаваць пошук праз Гугл.",
"dberr-outofdate": "Заўважце, што тамтэйшыя індэксы тутэйшага зместу могуць быць састарэлымі.",
"dberr-cachederror": "Гэта копія старонкі, узятая з кэшу, і, магчыма, састарэлая.",
"htmlform-submit": "Падаць",
"htmlform-reset": "Адкаціць змяненні",
"htmlform-selectorother-other": "Рознае",
+ "htmlform-no": "Не",
"htmlform-cloner-create": "Дадаць яшчэ",
"sqlite-has-fts": "$1 з падтрымкай поўна-тэкставага пошуку",
"sqlite-no-fts": "$1 без падтрымкі поўна-тэкставага пошуку",
- "logentry-delete-delete": "$1 выдаліў старонку $3",
+ "logentry-delete-delete": "$1 {{GENDER:$2|сцёр|сцёрла}} старонку $3",
"logentry-delete-restore": "$1 {{GENDER:$2|аднавіў|аднавіла}} старонку $3",
"logentry-delete-event": "$1 {{GENDER:$2|змяніў|змяніла}} бачнасць {{PLURAL:$5|запісу журнала|$5 запісаў журнала}} $3: $4",
"logentry-delete-revision": "$1 {{GENDER:$2|змяніў|змяніла}} бачнасць {{PLURAL:$5|версіі|$5 версій|$5 версій}} старонкі $3: $4",
"logentry-delete-event-legacy": "$1 {{GENDER:$2|змяніў|змяніла}} бачнасць запісаў журнала $3",
"logentry-delete-revision-legacy": "$1 {{GENDER:$2|змяніў|змяніла}} бачнасць версій на старонцы $3",
"logentry-suppress-delete": "$1 {{GENDER:$2|заглушыў|заглушыла}} старонку $3",
- "logentry-suppress-event": "$1 утойліва змяніў бачнасць {{PLURAL:$5|$5 запіс часопіса|$5 запісы часопіса |$5 запісаў часопіса}} на $3: $4",
- "logentry-suppress-revision": "$1 утойліва змяніў бачнасць {{PLURAL:$5|$5 версію|$5 версіі|$5 версій}} на старонцы $3: $4",
- "logentry-suppress-event-legacy": "$1 утойліва змяніў бачнасць запісаў журнала $3",
- "logentry-suppress-revision-legacy": "$1 утойліва змяніў бачнасць версій на старонцы $3",
+ "logentry-suppress-event": "$1 утойліва {{GENDER:$2|змяніў|змяніла}} бачнасць {{PLURAL:$5|запісу журнала|$5 запісаў журнала}} $3: $4",
+ "logentry-suppress-revision": "$1 утойліва {{GENDER:$2|змяніў|змяніла}} бачнасць {{PLURAL:$5|версіі|$5 версій}} старонкі $3: $4",
+ "logentry-suppress-event-legacy": "$1 утойліва {{GENDER:$2|змяніў|змяніла}} бачнасць запісаў журнала $3",
+ "logentry-suppress-revision-legacy": "$1 утойліва {{GENDER:$2|змяніў|змяніла}} бачнасць версій на старонцы $3",
"revdelete-content-hid": "змест схаваны",
"revdelete-summary-hid": "апісанне змены схавана",
"revdelete-uname-hid": "імя ўдзельніка схавана",
"revdelete-uname-unhid": "імя ўдзельніка адкрыта",
"revdelete-restricted": "пастаўленыя абмежаванні на адміністратараў",
"revdelete-unrestricted": "знятыя абмежаванні з адміністратараў",
- "logentry-move-move": "$1 перанёс старонку $3 у $4",
- "logentry-move-move-noredirect": "$1 перанёс старонку $3 у $4 без пакідання перанакіравання",
- "logentry-move-move_redir": "$1 пераназваў старонку $3 у $4 па-над перанакіраваннем",
- "logentry-move-move_redir-noredirect": "$1 пераназваў старонку $3 у $4 па-над перанакіраваннем і без пакідання перанакіравання",
+ "logentry-move-move": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4",
+ "logentry-move-move-noredirect": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4, не пакінуўшы перасылкі",
+ "logentry-move-move_redir": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4 па-над перасылкаю",
+ "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4 па-над перасылкаю, не пакінуўшы перасылкі",
"logentry-patrol-patrol": "$1 адпатруляваў версію $4 старонкі $3",
"logentry-patrol-patrol-auto": "$1 аўтаматычна адпатруляваў версію $4 старонкі $3",
- "logentry-newusers-newusers": "$1 стварыў уліковы запіс удзельніка",
- "logentry-newusers-create": "$1 стварыў уліковы запіс удзельніка",
- "logentry-newusers-create2": "$1 стварыў уліковы запіс удзельніка $3",
+ "logentry-newusers-newusers": "Створаны ўліковы запіс {{GENDER:$2|удзельніка}} $1",
+ "logentry-newusers-create": "Створаны ўліковы запіс {{GENDER:$4|удзельніка|удзельніцы}} $1",
+ "logentry-newusers-create2": "$1 {{GENDER:$2|стварыў|стварыла}} уліковы запіс {{GENDER:$4|удзельніка|удзельніцы}} $3",
+ "logentry-newusers-byemail": "$1 {{GENDER:$2|стварыў|стварыла}} ўліковы запіс {{GENDER:$4|удзельніка|удзельніцы}} $3; пароль адпраўлены на адрас эл.пошты.",
"logentry-newusers-autocreate": "Аўтаматычна створаны ўліковы запіс удзельніка $1",
"rightsnone": "(няма)",
"feedback-bugornote": "Калі вы гатовыя падрабязна апісаць тэхнічную праблему, калі ласка, [$1 паведаміце пра памылку].\nУ адваротным выпадку вы можаце выкарыстоўваць гэтую простую форму. Ваш каментар будзе дададзены на старонку «[$3 $2]» разам з вашым імем удзельніка і выкарыстоўваемым браўзерам.",
"qbmyoptions": "Моите страници",
"faq": "ЧЗВ",
"faqpage": "Project:ЧЗВ",
- "vector-action-addsection": "Добавяне на тема",
- "vector-action-delete": "Изтриване",
- "vector-action-move": "Преместване",
- "vector-action-protect": "Защита",
- "vector-action-undelete": "Възстановяване",
- "vector-action-unprotect": "Промяна на защитата",
- "vector-view-create": "Създаване",
- "vector-view-edit": "Редактиране",
- "vector-view-history": "История",
- "vector-view-view": "Преглед",
- "vector-view-viewsource": "Преглед на кода",
"actions": "Действия",
"namespaces": "Именни пространства",
"variants": "Варианти",
"difference-missing-revision": "{{PLURAL:$2|Не беше открита|Не бяха открити}} {{PLURAL:$2|една версия|$2 версии}} от тази разликова препратка ($1).\n\nТова обикновено се случва, когато е последвана остаряларазликова препратка на страница,коятоебила изтрита.\nПовече подробности могат да бъдат открити в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневника на изтриванията].",
"searchresults": "Резултати от търсенето",
"searchresults-title": "Резултати от търсенето за „$1“",
- "toomanymatches": "Бяха открити твърде много съвпадения, опитайте с различна заявка",
"titlematches": "Съответствия в заглавията на страници",
"textmatches": "Съответствия в текста на страници",
"notextmatches": "Няма съответствия в текста на страници",
"tooltip-preferences-save": "Съхраняване на предпочитанията",
"tooltip-summary": "Въведете кратко резюме",
"common.css": "/* Чрез редактиране на този файл ще промените всички облици */",
- "monobook.css": "/* Чрез редактиране на този файл можете да промените облика Монобук */",
"common.js": "/* Този файл съдържа код на Джаваскрипт и се зарежда при всички потребители. */",
- "monobook.js": "/* Остаряла страница; използвайте [[MediaWiki:Common.js]] */",
"anonymous": "{{PLURAL:$1|Анонимен потребител|Анонимни потребители}}на {{SITENAME}}",
"siteuser": "потребител на {{SITENAME}} $1",
"anonuser": "Анонимен потребител на {{SITENAME}} $1",
"pageinfo-category-pages": "Брой страници",
"pageinfo-category-subcats": "Брой подкатегории",
"pageinfo-category-files": "Брой файлове",
- "skinname-monobook": "Монобук",
"markaspatrolleddiff": "Отбелязване като проверена редакция",
"markaspatrolledtext": "Отбелязване на редакцията като проверена",
"markedaspatrolled": "Проверена редакция",
"tog-showtoolbar": "सम्पादन औजार् बक्सा के दिखाइल् जाए",
"tog-editondblclick": "दुई क्लिक पर पृष्ठ संपादित करीं (जावास्क्रिप्ट आवश्यक बा)",
"tog-editsectiononrightclick": "अनुभाग शीर्षक पर दायाँ क्लिक कर अनुभाग सम्पादित करीं (जावास्क्रिप्ट आवश्यक बा)",
- "tog-rememberpassword": "इ ब्राउजर पर हमार प्रवेश जारी रहे (अधिकतम $1 {{PLURAL:$1|दिन|दिन}})",
"tog-watchcreations": "हमरा द्वारा निर्मित पृष्ठ आ हमरा द्वारा लादल फ़ाइलन के हमार ध्यानसूची में जोड़ी",
"tog-watchdefault": "हमरा द्वारा निर्मित पृष्ठ आ हमरा द्वारा लादल फ़ाइलन के हमार ध्यानसूची में जोड़ी",
"tog-watchmoves": "हमरा द्वारा स्थानांतरित पृष्ठ आ लादल फाईल के हमरा ध्यानसूची में जोड़ी",
"qbmyoptions": "हमार पन्ना",
"faq": "साधारण सवाल",
"faqpage": "Project:साधारण सवाल",
- "vector-action-addsection": "विषय जोड़ीं",
- "vector-action-delete": "मिटाईं",
- "vector-action-move": "स्थांतरण",
- "vector-action-protect": "संरक्षित करीं",
- "vector-action-undelete": "मत मिटाईं",
- "vector-action-unprotect": "सुरक्षा बदलीं",
- "vector-view-create": "बनाईं",
- "vector-view-edit": "सम्पादन",
- "vector-view-history": "इतिहास देखीं",
- "vector-view-view": "पढ़ीं",
- "vector-view-viewsource": "स्त्रोत देखीं",
"actions": "क्रिया",
"namespaces": "नामस्थान",
"variants": "संस्करण",
"readonly_lag": "उपमुख्य डाटाबेस सर्वर मुख्य डाटाबेस के बराबर परावर्तित होत समय मुख्य डाटाबेस सर्वर अपने आप लॉक हो गइल।",
"internalerror": "आन्तरिक त्रुटि",
"internalerror_info": "आन्तरिक त्रुटि: $1",
- "fileappenderrorread": "संलग्न करे के दौरान \"$1\" पढ़ल नईखे जा सकत।",
- "fileappenderror": "\"$1\" के आगे \"$2\" ना जुड़ पावल",
"filecopyerror": "\"$1\" फ़ाइल के \"$2\" पर प्रतिलिपि ना बन पाईल।",
"filerenameerror": "\"$1\" फ़ाइल के नाम बदल के \"$2\" नइखे रखल जा सकत।",
"filedeleteerror": "\"$1\" फ़ाइल के ना हटावल जा सकल।",
"directorycreateerror": "\"$1\" डाइरेक्टरी ना बनावल जा सकल।",
"filenotfound": "\"$1\" फ़ाइल ना मिलल।",
- "fileexistserror": "फ़ाइल \"$1\" पर नइखी लिख सकत: फ़ाइल अस्तित्व में बा।",
"unexpected": "अनपेक्षित मूल्य: \"$1\"=\"$2\".",
"formerror": "त्रुटि: फ़ॉर्म सबमिट ना करल जा सकल।",
"badarticleerror": "इ पन्ना पर इ कार्य नइखे करल जा सकत।",
"gotaccountlink": "खाता में प्रवेश",
"userlogin-resetlink": "का रउआ आपन प्रवेश जानकारी भूला गइल बानी?",
"userlogin-resetpassword-link": "आपन गुप्तशब्द के फिर से बहाल करीं",
- "createacct-join": "अपना बारे में जानकारी नीचे लिखीं",
- "createacct-another-join": "नयका खाता के जानकारी नीचे लिखीं",
"createacct-emailrequired": "ई-मेल पता",
"createacct-emailoptional": "ई-मेल पता (वैकल्पिक)",
"createacct-email-ph": "आपन ई-मेल पता लिखीं",
"savearticle": "पन्ना सुरक्षित करीं",
"preview": "पूर्वावलोकन",
"showpreview": "पूर्वावलोकन देखाईं",
- "showlivepreview": "सीधा पूर्वावलोकन",
"showdiff": "परिवर्तन देखाईं",
"anoneditwarning": "'''चेतावनी:''' रउआ आपन खाता में प्रवेश नईखीं कईले। ई पन्ना के सम्पादन इतिहास पर राउर आई पी पता दर्ज कईल जाई।",
"anonpreviewwarning": "''रउआ खाता में प्रवेश नईखीं भईल। सुरक्षित करेब त ई पन्ना के सम्पादन इतिहास पर राउर आई पी पता दर्ज हो जाई।\"",
"permissionserrors": "अनुमति त्रुटी",
"log-fulllog": "पूरा लॉग देखीं",
"edit-conflict": "संपादन अंतर्विरोध",
- "postedit-confirmation": "राउर सम्पादन सुरक्षित कर दिहल गईल।",
+ "postedit-confirmation-saved": "राउर सम्पादन सुरक्षित कर दिहल गईल।",
"invalid-content-data": "अवैध डाटा सामग्री",
"content-model-wikitext": "विकीपाठ्य",
"content-model-text": "सामान्य पाठ",
"searchmenu-exists": "'''इ विकि पर ''[[:$1]]'' नाम से एगो पन्ना उपलब्ध बा'''",
"searchmenu-new": "'''इ विकि पर ''[[:$1]]'' नाम से पन्ना बनाईं'''",
"searchprofile-articles": "सामग्री पन्ना",
- "searchprofile-project": "मदद आ परियोजना पन्ना",
"searchprofile-images": "मल्टिमीडिया",
"searchprofile-everything": "सब कुछ",
"searchprofile-advanced": "अग्रिम",
"searchprofile-articles-tooltip": "$1 में खोजीं",
- "searchprofile-project-tooltip": "$1 में खोजीं",
"searchprofile-images-tooltip": "फाईल खातिर खोज",
"searchprofile-everything-tooltip": "सभन सामग्री में खोजीं (वार्ता पन्ना सहित)",
"searchprofile-advanced-tooltip": "विशेष नामस्थान में खोजीं",
"search-interwiki-default": "$1 के परिणाम:",
"search-interwiki-more": "(अउर)",
"search-relatedarticle": "संबंधित",
- "searcheverything-enable": "सभन सन्दर्भ में खोजीं",
"searchrelated": "संबंधित",
"searchall": "सब",
"showingresults": "नीचे देखावल जा रहल बा {{PLURAL:$1|'''1''' परिणाम|'''$1''' परिणाम}} #'''$2''' से शुरु होवे वाला।",
"search-nonefound": "राउर खोज मे से मेल खात कउनो परिणाम नईखे बा",
"powersearch-legend": "उन्नत खोज",
"powersearch-ns": "सन्दर्भ में खोजीं",
- "powersearch-redir": "पुन:निर्देश सूची",
"powersearch-togglelabel": "जाँच:",
"powersearch-toggleall": "सब",
"powersearch-togglenone": "कउनो ना",
"move": "स्थान्तरण",
"movethispage": "ई पन्ना के स्थांतरण करीं",
"booksources": "किताबी स्त्रोत",
- "alphaindexline": "$1 से $2",
"allarticles": "सभी पन्ना",
"allpagessubmit": "जाईं",
"allpagesprefix": "उपसर्ग के साथे पन्ना प्रदर्शन:",
"namespacesall": "सब",
"monthsall": "सब",
"confirmemail": "इ-मेल पता कन्फर्म करीं",
+ "version-no-ext-name": "[अज्ञात नाम]",
"specialpages": "ख़ाश पन्ना",
"revdelete-restricted": "प्रबंधक पर प्रतिबंध लागू",
"revdelete-unrestricted": "प्रबंधक पर से प्रतिबंध समाप्त"
"qbmyoptions": "আমার পাতাসমূহ",
"faq": "সম্ভাব্য প্রশ্নসমূহ",
"faqpage": "Project:প্রাজিপ্র",
- "vector-action-addsection": "বিষয় যোগ",
- "vector-action-delete": "অপসারণ",
- "vector-action-move": "স্থানান্তর",
- "vector-action-protect": "সুরক্ষা",
- "vector-action-undelete": "পুনরুদ্ধার",
- "vector-action-unprotect": "সুরক্ষা পরিবর্তন",
- "vector-view-create": "তৈরি",
- "vector-view-edit": "সম্পাদনা",
- "vector-view-history": "ইতিহাস",
- "vector-view-view": "পড়ুন",
- "vector-view-viewsource": "উৎস দেখুন",
"actions": "কার্যক্রম",
- "vector-more-actions": "আরও",
"namespaces": "নামস্থান",
"variants": "বিকল্পসমূহ",
"navigation-heading": "পরিভ্রমণ মেনু",
"difference-missing-revision": "$1 পার্থক্যের {{PLURAL:$2|একটি সংস্করণ|$2টি সংস্করণসমূহ}} খুজে পাওয়া যাচ্ছে না।\n\nসাধারণত মুছে ফেলা হয়েছে এমন পাতার মেয়াদ উত্তীর্ণ ইতিহাস পাতার লিংক ওপেন করার কারণে এটি হতে পারে। \n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] বিস্তারিত তথ্য জানা যাবে।",
"searchresults": "অনুসন্ধানের ফলাফল",
"searchresults-title": "\"$1\" অনুসন্ধানের ফলাফল",
- "toomanymatches": "একই রকম অনেকগুলো উত্তর এসেছে, অনুগ্রহ করে অন্য কোন কুয়েরি দিন",
"titlematches": "নিবন্ধের শিরোনাম মিলেছে",
"textmatches": "পাতার লেখার সাথে মিলেছে",
"notextmatches": "কোন পাতার লেখার সাথে মিলে নেই",
"pageinfo-category-pages": "পাতার সংখ্যা",
"pageinfo-category-subcats": "উপবিষয়শ্রেণীর সংখ্যা",
"pageinfo-category-files": "ফাইলের সংখ্যা",
- "skinname-monobook": "মনোবুক",
- "skinname-vector": "ভেক্টর",
"markaspatrolleddiff": "পরীক্ষিত বলে চিহ্নিত করুন",
"markaspatrolledtext": "এই নিবন্ধটিকে পরীক্ষিত বলে চিহ্নিত করুন",
"markedaspatrolled": "পরীক্ষিত বলে চিহ্নিত করুন",
"VIGNERON",
"Y-M D",
"לערי ריינהארט",
- "아라"
+ "아라",
+ "Pymouss"
]
},
"tog-underline": "Liammoù islinennet",
"qbmyoptions": "Ma dibaboù",
"faq": "FAG",
"faqpage": "Project:FAG",
- "vector-action-addsection": "Rannbennad nevez",
- "vector-action-delete": "Diverkañ",
- "vector-action-move": "Adenvel",
- "vector-action-protect": "Gwareziñ",
- "vector-action-undelete": "Diziverkañ",
- "vector-action-unprotect": "Cheñch gwarez",
- "vector-view-create": "Krouiñ",
- "vector-view-edit": "Kemmañ",
- "vector-view-history": "Gwelet an istor",
- "vector-view-view": "Lenn",
- "vector-view-viewsource": "Sellet ouzh tarzh an destenn",
"actions": "Oberoù",
- "vector-more-actions": "Muioc'h",
"namespaces": "Esaouennoù anv",
"variants": "Adstummoù",
"navigation-heading": "Lañser merdeiñ",
"userlogin-loggedin": "Kevreet oc'h dija evel {{GENDER:$1|$1}}.\nImplijit ar furmskrid amañ dindan evit kevreañ evel un implijer all.",
"userlogin-createanother": "Krouiñ ur gont all",
"createacct-emailrequired": "Chomlec'h postel",
- "createacct-emailoptional": "Chomlec'h postel (direizh)",
+ "createacct-emailoptional": "Chomlec'h postel (diret)",
"createacct-email-ph": "Skrivit ho chomlec'h postel",
"createacct-another-email-ph": "Ebarzhiñ ur chomlec'h postel",
"createaccountmail": "Implijout ur ger-tremen dibad ha kas anezhañ d'ar chomlec'h postel diferetDre bostel",
"difference-missing-revision": "!!{{PLURAL:$2|Un adweladur|$2 adweladurioù}} eus an disheñvelder ($1) {{PLURAL:$2|n'eo ket bet kavet|n'int ket bet adkavet}}.\n\nC'hoarvezout a ra peurliesañ pa vez heuliet ul liamm disheñvel dispredet war-zu ur bajenn zo bet dilamet.\nGallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} renabl an dilamadurioù].",
"searchresults": "Disoc'hoù enklask",
"searchresults-title": "Disoc'hoù klask evit \"$1\"",
- "toomanymatches": "Re a respontoù a glot gant ar goulenn, klaskit gant ur goulenn all",
"titlematches": "Klotadurioù gant an titloù",
"textmatches": "Klotadurioù en testennoù",
"notextmatches": "N'emañ ar ger(ioù) goulennet e testenn pennad ebet",
"tooltip-preferences-save": "Enrollañ ar penndibaboù",
"tooltip-summary": "Skrivit un diveradenn verr",
"common.css": "/** Talvezout a raio ar CSS lakaet amañ evit an holl wiskadurioù */",
- "monobook.css": "/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Monobook */",
- "vector.css": "/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Vektor */",
"print.css": "/* Talvezout a raio ar CSS lakaet amañ evit ar moullañ */",
"noscript.css": "/* Talvezout a raio ar CSS lakaet amañ evit an implijerien o deus diweredekaet JavaScript */",
"group-autoconfirmed.css": "/* Talvezout a raio ar CSS lakaet amañ evit an impjerien bet kadarnaet ent emgefre hepken */",
"group-sysop.css": "/* Talvezout a raio ar CSS lakaet amañ evit ar verourien hepken */",
"group-bureaucrat.css": "/* Talvezout a raio ar CSS lakaet amañ evit ar vureveien hepken */",
"common.js": "/* Kement JavaScript amañ a vo karget evit an holl implijerien war kement pajenn lennet ganto. */",
- "monobook.js": "/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur MonoBook */",
- "vector.js": "/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Vektor */",
"anonymous": "{{PLURAL:$1|Implijer|Implijerien}} dizanv war {{SITENAME}}",
"siteuser": "Implijer(ez) $1 eus {{SITENAME}}",
"anonuser": "implijer dizanv $1 eus {{SITENAME}}",
"pageinfo-category-pages": "Niver a bajennoù",
"pageinfo-category-subcats": "Niver a isrummadoù",
"pageinfo-category-files": "Niver a restroù",
- "skinname-monobook": "MonoBook",
- "skinname-vector": "Vektor",
"markaspatrolleddiff": "Merkañ evel gwiriet",
"markaspatrolledtext": "Merkañ ar pennad-mañ evel gwiriet",
"markedaspatrolled": "Merkañ evel gwiriet",
"qbmyoptions": "Moje opcije",
"faq": "ČPP",
"faqpage": "Project:NPP",
- "vector-action-addsection": "Dodaj temu",
- "vector-action-delete": "Izbriši",
- "vector-action-move": "Pomjeri",
- "vector-action-protect": "Zaštiti",
- "vector-action-undelete": "Vrati obrisano",
- "vector-action-unprotect": "Promijeni zaštitu",
- "vector-view-create": "Napravi",
- "vector-view-edit": "Uredi",
- "vector-view-history": "Pregled historije",
- "vector-view-view": "Čitanje",
- "vector-view-viewsource": "Pogledaj izvor",
"actions": "Akcije",
"namespaces": "Imenski prostori",
"variants": "Varijante",
"difference-missing-revision": "{{PLURAL:$2|Jedna izmjena|$2 izmjene}} od ove razlike ($1) ne {{PLURAL:$2|postoji|postoje}}.\n\nOvo se obično dešava kada pratite zastarjelu vezu na stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokol brisanja].",
"searchresults": "Rezultati pretrage",
"searchresults-title": "Rezultati pretrage za \"$1\"",
- "toomanymatches": "Pronađeno je previše rezultata, molimo pokušajte unijeti konkretniji izraz",
"titlematches": "Naslov članka odgovara",
"textmatches": "Tekst stranice odgovara",
"notextmatches": "Tekst članka ne odgovara",
"newpages": "Nove stranice",
"newpages-username": "Korisničko ime:",
"ancientpages": "Najstarije stranice",
- "move": "Pomjeri",
+ "move": "Preusmjeri",
"movethispage": "Premjesti ovu stranicu",
"unusedimagestext": "Slijedeće datoteke postoje ali nisu uključene ni u jednu stranicu.\nMolimo obratite pažnju da druge web stranice mogu biti povezane s datotekom putem direktnog URLa, tako da i pored toga mogu biti prikazane ovdje pored aktivne upotrebe.",
"unusedcategoriestext": "Slijedeće stranice kategorija postoje iako ih ni jedan drugi članak ili kategorija ne koriste.",
"tooltip-preferences-save": "Sačuvaj podešavanja",
"tooltip-summary": "Unesite kratki sažetak",
"common.css": "/* CSS umetnut ovdje primijenit će se na sve skinove */",
- "monobook.css": "/* CSS umetnut ovdje uticat će na korisnike koji koriste Monobook skin */",
"print.css": "/* CSS umetnut ovdje uticat će na izgled isprintane stranice */",
"common.js": "/* Bilo koja JavaScript će biti učitana za sve korisnike pri svakom učitavanju stranice. */",
- "monobook.js": "/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste MonoBook skin */",
"anonymous": "{{PLURAL:$1|Anonimni korisnik|$1 anonimna korisnika|$1 anonimnih korisnika}} projekta {{SITENAME}}",
"siteuser": "{{SITENAME}} korisnik $1",
"anonuser": "{{SITENAME}} anonimni korisnik $1",
"pageinfo-category-pages": "Broj stranica",
"pageinfo-category-subcats": "Broj podkategorija",
"pageinfo-category-files": "Broj datoteka",
- "skinname-monobook": "MonoKnjiga",
"markaspatrolleddiff": "Označi kao patrolirano",
"markaspatrolledtext": "Označi ovaj članak kao patroliran",
"markedaspatrolled": "Označeno kao patrolirano",
"qbmyoptions": "Pàgines pròpies",
"faq": "PMF",
"faqpage": "Project:PMF",
- "vector-action-addsection": "Nova secció",
- "vector-action-delete": "Esborra",
- "vector-action-move": "Reanomena",
- "vector-action-protect": "Protegeix",
- "vector-action-undelete": "Restaura",
- "vector-action-unprotect": "Desprotegeix",
- "vector-view-create": "Crea",
- "vector-view-edit": "Modifica",
- "vector-view-history": "Mostra l'historial",
- "vector-view-view": "Mostra",
- "vector-view-viewsource": "Mostra el codi",
"actions": "Accions",
- "vector-more-actions": "Més",
"namespaces": "Espais de noms",
"variants": "Variants",
"navigation-heading": "Menú de navegació",
"revdelete-nooldid-title": "La revisió objectiu no és vàlida",
"revdelete-nooldid-text": "No heu especificat unes revisions objectius per a realitzar aquesta\nfunció, la revisió especificada no existeix, o bé esteu provant d'amagar l'actual revisió.",
"revdelete-no-file": "El fitxer especificat no existeix.",
- "revdelete-show-file-confirm": "Esteu segurs que voleu veure una revisió esborrada del fitxer «<nowiki>$1</nowiki>» de $2 a $3?",
+ "revdelete-show-file-confirm": "Esteu segur que voleu veure una revisió esborrada del fitxer «<nowiki>$1</nowiki>» de $2 a $3?",
"revdelete-show-file-submit": "Sí",
"revdelete-selected-text": "{{PLURAL:$1|Versió seleccionada|Versions seleccionades}} de [[:$2]]:",
"revdelete-selected-file": "{{PLURAL:$1|Versió seleccionada|Versions seleccionades}} del fitxer [[:$2]]:",
"difference-missing-revision": "{{PLURAL:$2|Una revisió|$2 revisions}} d'aquesta diferència ($1) no {{PLURAL:$2|s'ha|s'han}} trobat.\n\nAixò passa generalment en seguir un enllaç obsolet de diferències a una pàgina que s'ha suprimit.\nEs pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registre de supressions].",
"searchresults": "Resultats de la cerca",
"searchresults-title": "Resultats de la recerca de «$1»",
- "toomanymatches": "S'han retornat masses coincidències. Proveu-ho amb una consulta diferent.",
"titlematches": "Coincidències de títol de la pàgina",
"textmatches": "Coincidències de text de pàgina",
"notextmatches": "No hi ha cap coincidència de text de pàgina",
"tooltip-summary": "Afegiu un breu resum",
"interlanguage-link-title": "$1 - $2",
"common.css": "/* Editeu aquest fitxer per personalitzar totes les aparences per al lloc sencer */",
- "monobook.css": "/* Editeu aquest fitxer per personalitzar l'aparença del monobook per a tot el lloc sencer */",
"common.js": "/* Es carregarà per a tots els usuaris, i per a qualsevol pàgina, el codi JavaScript que hi haja després d'aquesta línia. */",
"anonymous": "Usuari{{PLURAL:$1| anònim|s anònims}} del projecte {{SITENAME}}",
"siteuser": "{{GENDER:$2|l'usuari|la usuària}} $1 del projecte {{SITENAME}}",
"Xqt",
"Yejianfei",
"Hakka",
- "아라"
+ "아라",
+ "Mywood"
]
},
"tog-underline": "下劃綫鏈接",
"qbmyoptions": "我其頁面",
"faq": "經稠碰著其問題",
"faqpage": "Project:經稠碰著其問題",
- "vector-action-addsection": "加話題",
- "vector-action-delete": "刪掉咯",
- "vector-action-move": "移動",
- "vector-action-protect": "保護",
- "vector-action-undelete": "取消刪除",
- "vector-action-unprotect": "改變保護",
- "vector-view-create": "創建",
- "vector-view-edit": "修改",
- "vector-view-history": "看歷史",
- "vector-view-view": "讀",
- "vector-view-viewsource": "看源代碼",
"actions": "動作",
"namespaces": "命名空間",
"variants": "變體",
"history_short": "歷史",
"updatedmarker": "趁我最後蜀回訪問開始更新",
"printableversion": "會拍印其版本",
- "permalink": "永久鏈接",
+ "permalink": "固定链接",
"print": "拍印",
"view": "覷蜀覷",
"edit": "修改",
"searchprofile-everything": "所有乇",
"searchprofile-advanced": "高級",
"searchprofile-articles-tooltip": "敆$1𡅏尋討",
- "searchprofile-project-tooltip": "敆$1𡅏尋討",
"searchprofile-images-tooltip": "尋討文件",
"search-result-size": "$1 ({{PLURAL:$2|$2萆單詞}})",
"search-redirect": "(重定向 $1)",
"prefs-files": "文件",
"youremail": "電子郵件:",
"username": "{{GENDER:$1|用戶名}}:",
- "uid": "{{GENDER:$1|用戶}}ID:",
"prefs-registration": "開賬戶時間",
"yourrealname": "真實姓名:",
"yourlanguage": "語言:",
"alllogstext": "所有會使趁{{SITENAME}}獲得其日誌其都合併顯示。\n汝會使使揀選日誌類型、用戶名(大小寫敏感),或者受影響其頁面(大小寫敏感)其方法來縮小視角。",
"logempty": "日誌底裏討要𣍐著項目",
"allpages": "所有頁面",
- "alphaindexline": "$1遘$2",
"nextpage": "下蜀頁($1)",
"prevpage": "前蜀頁($1)",
"allpagesfrom": "使下底其乇開始顯示頁:",
"whatlinkshere-filters": "過濾器",
"blockip": "封鎖用戶",
"blockiptext": "使下底其表單來封鎖趁指定IP地址或者用戶名其寫入訪問。茲囇使廮𡅏防止破壞,固加著符合[[{{MediaWiki:Policy-url}}|政策]]。敆下底填底指定其原因(比如講:引用乞破壞其頁面)。",
- "ipadressorusername": "IP地址或者用戶名:",
+ "ipaddressorusername": "IP地址或者用戶名:",
"ipbexpiry": "過期:",
"ipbreason": "原因:",
"ipbreason-dropdown": "*普通封鎖原因\n** 加添假其信息\n** 塗掉頁面內容\n** 發佈不實信息\n** 亂寫文字\n** 做獃/騷擾\n** 亂開賬戶\n** 亂起用戶名",
"previousdiff": "← 舊其修改",
"nextdiff": "新其修改 →",
"file-nohires": "無更高決斷",
- "showhidebots": "($1機器人)",
"ilsubmit": "尋討",
"bydate": "按日期",
"metadata": "元數據",
"qbmyoptions": "Хьан нисдарш",
"faq": "СиХХ",
"faqpage": "Project:СиХХ",
- "vector-action-addsection": "ТӀетоха хьедар",
- "vector-action-delete": "ДӀаяккха",
- "vector-action-move": "ЦӀе хийца",
- "vector-action-protect": "Гlаролла дé",
- "vector-action-undelete": "Меттахlоттадé",
- "vector-action-unprotect": "ГӀароллех къаста",
- "vector-view-create": "Кхоллар",
- "vector-view-edit": "Нисъе",
- "vector-view-history": "АгӀона хийцамаш",
- "vector-view-view": "Éшар",
- "vector-view-viewsource": "Билглонашка хьажа",
"actions": "Дийраш",
- "vector-more-actions": "Кхин",
"namespaces": "Цlерийн ана",
"variants": "Кепараш",
"navigation-heading": "Навигацин меню",
"loginreqlink": "Логин",
"loginreqpagetext": "Ахьа да деза $1, кхин агӀонаш хьажа.",
"accmailtitle": "Пароль дlаяхьийтина.",
- "accmailtext": "Пароль декъашхочуьна [[User talk:$1|$1]], йина ша шех хитта делла чу элпашах, дlаяхийтина хьокху $2 адрес тӀе.\n\nЧуваьлла/яла чул тӀехьа , кху гlирса чохь шуьга хийцалур ю ''[[Special:ChangePassword|шай пароль]]''.",
+ "accmailtext": "Пароль декъашхочуьнан [[User talk:$1|$1]], йина ша шех хитта делла чу элпашах, дӀаяхийтина хьокху $2 адрес тӀе.\n\nЧуваьлла/яла чул тӀехьа , кху гӀирса чохь шуьга хийцалур ю ''[[Special:ChangePassword|шай пароль]]''.",
"newarticle": "(Kерла)",
"newarticletext": "Хьо веана хьажоригци хӀокху агӀон тӀе, хӀара агӀо хӀинца йоцаш ю.\nНагахь иза кхолла лаахь, хӀотта де лахо гуш долу корехь йоза (мадарра хьажа. [$1 гӀон агӀон чу]).\nНагахь гӀалат даьлла цахууш кхечехь кхузе, атта тӀе тӀаӀа йе '''юха йоккхуриг''' хьай гӀирса тӀехь.",
"anontalkpagetext": "----''ХӀара дийцаре агӀо къайлаха декъашхочуьна ю, хӀинца дӀаяздар доцу, я лелош воцуш/йоцуш.\nЦундела иза вовзийта/йовзийта лелош ду терахьца IP-адрес.\nИза терахь долу меттиг хила мега кхечу декъашхойчух терра.\nНагахь хьо къайлах волу декъашхо валахь хьайна хаам кхаьчна аьлла хеташн, хьуна хьажийна доцуш, дехар до, кхолла хьай меттиг кху чохь[[Special:UserLogin/signup|дӀаяздар кхоллар]] я [[Special:UserLogin|системин чугӀо]],",
"readonlywarning": "'''ДӀАХЬЕДО. ГӀирса бух блоктоьхна оьшуш долучу хьаштан, цундера хӀинц хьоьга дӀа ца йазло хийцам.\nХила мега, ахьа Ӏалаш дан дезаш хьайн йоза, юха тӀаьхьо леладан иза йоза.'''\n\nКуьйгалхочо блоктоьхна гӀирса бух, цо битина кхетош хӀара хаам: $1",
"protectedpagewarning": "'''Дlахьедар. Хlара агlо гlаролла дина ю хийцам цабайта, иза хийца йа нисйа а бакъо йолуш адаманкуьйгалла лелош болу декъашхой бе бац.'''\nЛахахьа гойту хаамаш тlаьхьара бина болу хийцамна тептар чура:",
"cascadeprotectedwarning": "<div id=\"cascadeprotectedwarning\" style=\"border:1px solid #ee0; padding:10px; background:#ffa; margin-bottom:1em\">[[file:Padlock.svg|left|25px|ДовгӀа|link=]]\nХӀара агӀо тада бакъо йолуш [[Project:Куьйгалхой|куьйгалхой]] бу, хӀунда аьлча и агӀо латийна кхечу агӀонашца хӀоттделлачу гӀаролле:</div>",
- "templatesused": "{{PLURAL:$1|1=Кеп, лелийна|Кепаш, лелош ду}} хlокху агlон башхонца:",
- "templatesusedpreview": "{{PLURAL:$1|1=Кеп, лелошдолу|Кепаш, лелошдолу}} оцу хьалх хьожучу агlонца:",
+ "templatesused": "{{PLURAL:$1|1=Кеп, лелийна|Кепаш, лелош ю}} хӀокху агон башхонца:",
+ "templatesusedpreview": "{{PLURAL:$1|1=Кеп, лелошдолу|Кепаш, лелойлу}} оцу хьалх хьожучу агӀонца:",
"templatesusedsection": "ХӀокху декъан чохь {{PLURAL:$1|1=лелош йолу кеп|лелош йолу кепаш}}:",
"template-protected": "(гlароллийца)",
"template-semiprotected": "(дуьззина доцуш гlаролла)",
"content-model-text": "цхьалхе йоза",
"content-model-javascript": "JavaScript",
"content-model-css": "CSS",
+ "expensive-parserfunction-warning": "'''Тидам бе!''' Ресурсийн функцийн дехарш сов даьлла агӀонаш .\n\nДукху хилла ца деза {{PLURAL:$2|$2 дехар|$2 дехарш|1=цхьана дехар}}, хӀинца $1 {{PLURAL:$1|дехар}} ду.",
+ "expensive-parserfunction-category": "Ресурсийн функцийн дехарш сов даьлла агӀонаш",
"post-expand-template-inclusion-warning": "ДӀахьедар: юкъа тоьхна кепашан жамӀан барам тӀех бокха бу. Цхьайолу кепаш юкъа тухур яц.",
"post-expand-template-inclusion-category": "Чу дуьхкуш долу кепашан барам тӀех баьлла агӀонаш",
"post-expand-template-argument-category": "Кепашан аргументаш юкъахь йитина агӀонаш",
"parser-template-loop-warning": "Карийна кепаш юкъахь хилла шад: [[$1]]",
"parser-template-recursion-depth-warning": "Дозанал хьаладаьлла кӀоргенца юх юха дина кеп ($1)",
+ "node-count-exceeded-category": "Шедийн дукхалла сов даьлла агӀонаш",
+ "node-count-exceeded-warning": "Шедийн дукхалла сов даьлла агӀонаш",
"expansion-depth-exceeded-category": "Схьаелларан кӀоргалла тӀех даьккхина агӀонаш",
"expansion-depth-exceeded-warning": "АгӀонгахь чуйихкар тӀехдаьккхина",
"parser-unstrip-loop-warning": "ДӀачӀагӀанца pre карина",
"listgrouprights-namespaceprotection-header": "ЦӀеран анан бехкам",
"listgrouprights-namespaceprotection-namespace": "ЦӀерийн ана",
"listgrouprights-namespaceprotection-restrictedto": "Декъашхочун хийцамаш бан таро хуьлуьйту бакъонаш",
+ "trackingcategories": "Хьожуш йолу категореш",
+ "trackingcategories-summary": "ХӀокху агӀонгахь ю хьожуш йолу категореш, MediaWikiс тӀеюзаш ю уьш. {{ns:8}} цӀерийн меттигера системин хаам хийцина цера цӀераш хийца йиш ю.",
"trackingcategories-msg": "Категореш зер",
"trackingcategories-name": "Хааман цӀе",
+ "trackingcategories-desc": "Категорин чутухуш йолчун хила деза хьал",
"expensive-parserfunction-category-desc": "АгӀорахь тӀех дуккха ресурсийн функцеш лелош ю (<code>#ifexist</code> саниш). Мадарра ду — [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] агӀонгахь.",
"trackingcategories-nodesc": "Цунах лаьцна хӀума дац.",
"trackingcategories-disabled": "Категори дӀаяйина ю",
"ipb-disableusertalk": "Цамагдо шин дийцаре агӀо та я блоктоьхна хан чекхъяллалц",
"ipb-change-block": "Юхаблоктоха декъашхочун оьцу хийцамашца",
"ipb-confirm": "Бакъде блоктохар",
+ "badipaddress": "Магийна доцу IP адрес",
"blockipsuccesssub": "Блоктохар чакхдели",
"blockipsuccesstext": "[[Special:Contributions/$1|«$1»]] {{GENDER:$1|блоктоьхна}}.<br />\nХьажа. [[Special:BlockList|блоктоьхна IP-адресийнн могӀам]].",
"ipb-blockingself": "Хьо хьайна блоктоха гӀерта! Лаьий хьона и кхочушдан?",
"block-log-flags-nousertalk": "шин дийцаре агӀо тая лууш дац",
"block-log-flags-hiddenname": "декъашхочун цӀе къайлаяьккхина",
"ipb_expiry_invalid": "Дешдерг дан нийса йоцу хан.",
+ "ipb_already_blocked": "«$1» хӀинцале блоктоьхна ю.",
"ipb-needreblock": "ХӀокху $1 декъашхочун {{GENDER:$1|блоктоьхна ю}}. Лаьий хьуна блоктохаран параметраш хийца?",
"ipb-otherblocks-header": "{{PLURAL:$1|Кхин блоктохар|Кхин блоктохарш}}",
"unblock-hideuser": "Декъашхочун тӀера блокдӀаяккха хьа таро яц, цуна цӀе хьулйина хилар бахьанехь.",
+ "ipb_cant_unblock": "ГӀалат: блоктохар цакарий $1. Иза хӀинцале дӀаяьккхина хила мега.",
"ip_range_invalid": "IP-адресийн магийна йоцу диапазон.",
+ "proxyblocker": "Проксин блоктохар",
"move-page": "$1 — цӀе хийцар",
"move-page-legend": "ЦӀe хийца яр",
- "movepagetext": "Бухахь йолу форманца агӀон цӀе хийцало. Цул совнах цуьна хийцаман журнал кхоьчу метте доккха. Хьалхалера цӀарахь хиръю керла кхоьллина агӀонан хьажораг.\n\nХьовсалаш [[Special:DoubleRedirects|шалха]] а [[Special:BrokenRedirects|йохна хьажоргаш]] юй техь аьлла.\n\nШу жоьпехь ду хьажоргаш нийса некъ гойтуш хиларан.\n\nТидам бе хьалхалера агӀон цӀе ‘’’хийцалур яц’’’ иштта цӀе йолу агӀо йолуш елахь. Юкъардаккхар: йолуш йолу агӀо кхоьчухьа хьажораг елахь, я еса елахь а, цуьна хьийцаме истори яцахь а.\n\nИ бохург ду шун агӀонан цӀе юха а хьалха хилларгчунтӀе хийца йиш ю, амма йолуш йолу агӀо дӀаяккха йиш яц.\n\n'''ДӀАХЬЕДАР!'''\n\nЦӀе хийцар бахьнехь гӀаръяьлла агӀонашна дукха дагахь боцу хийцамаш хила тарло. Цундела цӀе хийцале шеш хила тарлучу тӀехьонашах кхета аьлла тешна хила.",
- "movepagetext-noredirectfixer": "Бухахь йолу форманца агӀон цӀе хийцало. Цул совнах цуьна хийцаман журнал кхоьчу метте доккха. Хьалхалера цӀарахь хиръю керла кхоьллина агӀонан хьажораг.\n\nХьовсалаш [[Special:DoubleRedirects|шалха]] а [[Special:BrokenRedirects|йохна хьажоргаш]] юй техь аьлла.\n\nШу жоьпехь ду хьажоргаш нийса некъ гойтуш хиларан.\n\nТидам бе хьалхалера агӀон цӀе ‘’’хийцалур яц’’’ иштта цӀе йолу агӀо йолуш елахь. Юкъардаккхар: йолуш йолу агӀо кхоьчухьа хьажораг елахь, я еса елахь а, цуьна хьийцаме истори яцахь а.\n\nИ бохург ду шун агӀонан цӀе юха а хьалха хилларгчунтӀе хийца йиш ю, амма йолуш йолу агӀо дӀаяккха йиш яц.\n\n'''ДӀАХЬЕДАР!'''\n\nЦӀе хийцар бахьнехь гӀаръяьлла агӀонашна дукха дагахь боцу хийцамаш хила тарло. Цундела цӀе хийцале шеш хила тарлучу тӀехьонашах кхета аьлла тешна хила.",
+ "movepagetext": "Бухахь йолу форманца агӀон цӀе хийцало. Цул совнах цуьна хийцаман тептар кхоьчу метте доккха. Хьалхалера цӀарахь хиръю керла кхоьллина агӀонан хьажораг.\n\nХьовсалаш [[Special:DoubleRedirects|шалха]] а [[Special:BrokenRedirects|йохна хьажоргаш]] юй техь аьлла.\n\nШу жоьпехь ду хьажоргаш нийса некъ гойтуш хиларан.\n\nТидам бе хьалхалера агӀон цӀе ‘’’хийцалур яц’’’ иштта цӀе йолу агӀо йолуш елахь. Юкъардаккхар: йолуш йолу агӀо кхоьчухьа хьажораг елахь, я еса елахь а, цуьна хийцаме истори яцахь а.\n\nИ бохург ду шун агӀонан цӀе юха а хьалха хилларгчунтӀе хийца йиш ю, амма йолуш йолу агӀо дӀаяккха йиш яц.\n\n'''ДӀАХЬЕДАР!'''\n\nЦӀе хийцар бахьнехь гӀаръяьлла агӀонашна дукха дагахь боцу хийцамаш хила тарло. Цундела цӀе хийцале шеш хила тарлучу тӀехьонашах кхета аьлла тешна хила.",
+ "movepagetext-noredirectfixer": "Бухахь йолу форманца агӀон цӀе хийцало. Цул совнах цуьна хийцаман тептар кхоьчу метте доккха. Хьалхалера цӀарахь хиръю керла кхоьллина агӀонан хьажораг.\n\nХьовсалаш [[Special:DoubleRedirects|шалха]] а [[Special:BrokenRedirects|йохна хьажоргаш]] юй техь аьлла.\n\nШу жоьпехь ду хьажоргаш нийса некъ гойтуш хиларан.\n\nТидам бе хьалхалера агӀон цӀе ‘’’хийцалур яц’’’ иштта цӀе йолу агӀо йолуш елахь. Юкъардаккхар: йолуш йолу агӀо кхоьчухьа хьажораг елахь, я еса елахь а, цуьна хийцаме истори яцахь а.\n\nИ бохург ду шун агӀонан цӀе юха а хьалха хилларгчунтӀе хийца йиш ю, амма йолуш йолу агӀо дӀаяккха йиш яц.\n\n'''ДӀАХЬЕДАР!'''\n\nЦӀе хийцар бахьнехь гӀаръяьлла агӀонашна дукха дагахь боцу хийцамаш хила тарло. Цундела цӀе хийцале шеш хила тарлучу тӀехьонашах кхета аьлла тешна хила.",
"movepagetalktext": "ТӀе хӀоьттина йолу дийцаре агӀо ишта цӀе хийцина хира ю, '''цхьа йолу ханчохь, маца:'''\n\n*Йаьсса йоцу дийцаре агӀо йолуш ю оцу цӀарца йа\n*Ахьа къастаман харжам цабиняхь а къастам хӀотточехь.\n\nИшта чу ханчохь, ахьа дехьа яккха йезар ю йа куьйга хӀоттайар, нагахь иза хьашт йалахь.",
"movearticle": "Цle хийца хlокху агlон",
"moveuserpage-warning": "'''Тергам бе.''' Хьо декъашхочун агӀона цӀе хийца гӀерта. Дехар до, тергам бе, декъашхочун агӀона цӀе бен хийца лур яц, декъашхочун дӀаяздаран цӀе хийца лур яц.",
"tooltip-undo": "ДӀабаккха бина болу хийцам а хьалхьажар гойтуш, дӀаяккхарна бахьна гайта аьтту беш",
"tooltip-preferences-save": "ГӀирс нисбар Ӏалашде",
"tooltip-summary": "Язъе йоца цӀе",
+ "interlanguage-link-title-nonlang": "$1 – $2",
"common.css": "/** Чуйиллина йолу кхузе CSS хир ю лелош масхьа кечйечу чохь */",
- "monobook.css": "/* Чуйиллина йолу кхузе CSS хир ю лелош масхьа Monobook чохь */",
"print.css": "/* Чуйиллина йолу кхузе CSS хир ю лелош масхьа зорба тухучуче чохь */",
"common.js": "/* Чуйиллина йолу кхузе JavaScript код гучу ера ю массо декъашхошна оцара схьаелларца хlора агlо */",
- "monobook.js": "/* Кхузе чу язийна йолу JavaScript код, чу ера ю, массо MonoBook хатl лелош болу декъашхошна */",
"anonymous": "{{PLURAL:$1|1=ЦӀе хьулйина декъашхо|ЦӀе хьулйина декъашхой}} {{grammar:genitive|{{SITENAME}}}}",
"siteuser": "декъашхо {{grammar:genitive|{{SITENAME}}}} $1",
"anonuser": "цӀе хьулйина декъашхо {{grammar:genitive|{{SITENAME}}}} $1",
"pageinfo-category-pages": "АгӀонийн дукхалла",
"pageinfo-category-subcats": "Бухара категорийн дукхалла",
"pageinfo-category-files": "Файлийн дукхалла",
- "skinname-vector": "Векторан",
"markaspatrolleddiff": "Билгалйе теллина санна",
"markaspatrolledtext": "Билгала йе хӀара агӀо хьаьжна сана",
"markedaspatrolled": "ДӀадахка теллина санна хилар",
"show-big-image-preview": "Барам хьажале: $1.",
"show-big-image-other": "{{PLURAL:$2|1=Кхин шоралла|Кхин шоралла}}: $1.",
"show-big-image-size": "$1 × $2 пиксель",
+ "file-info-gif-looped": "чӀуг йиллина",
"file-info-gif-frames": "$1 {{PLURAL:$1|фрейм|фреймаш}}",
+ "file-info-png-looped": "чӀуг йиллина",
"file-info-png-repeat": "локху $1 {{PLURAL:$1|за}}",
"file-info-png-frames": "$1 {{PLURAL:$1|кадр|кадраш}}",
"newimages": "Керлачу файлийн галерей",
"exif-orientation-1": "Лартӏахь",
"exif-xyresolution-i": "$1 тӏадамаш дюйман",
"exif-xyresolution-c": "$1 тӀадамаш сантиметрна",
+ "exif-exposureprogram-1": "Куьйгаца",
"exif-subjectdistance-value": "$1 {{PLURAL:$1|метр}}",
"exif-meteringmode-0": "Хууш дац",
"exif-meteringmode-1": "Юкъара",
"exif-lightsource-9": "Хаза хенан хӀоттам",
"exif-lightsource-10": "Мархаш йолу",
"exif-lightsource-11": "ӀиндагӀ",
+ "exif-flash-mode-3": "авто хьал",
+ "exif-flash-function-1": "Серло яц",
"exif-focalplaneresolutionunit-2": "дюйм",
+ "exif-sensingmethod-1": "Билгала ца йинарг",
"exif-filesource-3": "Терахьийн суртдохку аппарат",
"exif-scenetype-1": "Сурт даьккхина нис дуьххьал",
"exif-customrendered-0": "ХӀума дийна дац",
"qbmyoptions": "پەڕەکانم",
"faq": "پرسیار و وەڵام (FAQ)",
"faqpage": "Project:پرسیار و وەڵام",
- "vector-action-addsection": "بابەت دابنێ",
- "vector-action-delete": "بیسڕەوە",
- "vector-action-move": "بیگوازەوە",
- "vector-action-protect": "بیپارێزە",
- "vector-action-undelete": "سڕینەوە بگەڕێنەوە",
- "vector-action-unprotect": "پاراستن بگۆڕە",
- "vector-view-create": "دروستکردن",
- "vector-view-edit": "دەستکاریی بکە",
- "vector-view-history": "مێژووەکەی ببینە",
- "vector-view-view": "بیخوێنەوە",
- "vector-view-viewsource": "سەرچاوەکەی ببینە",
"actions": "کردەوەکان",
- "vector-more-actions": "زیاتر",
"namespaces": "شوێنناوەکان",
"variants": "شێوەزارەکان",
"navigation-heading": "مێنۆی ڕێدۆزی",
"editundo": "پووچەڵکردنەوە",
"searchresults": "ئاکامەکانی گەڕان",
"searchresults-title": "ئاکامەکانی گەڕان بۆ «$1»",
- "toomanymatches": "هاوتای ئەوەی داوات کرد، زۆر هەیە. تکایە داوایتر تاقی بکەوە.",
"titlematches": "سەردێڕی پەڕە پێی ئەخوا",
"textmatches": "هاوتاکانی دەقی لاپەڕە",
"notextmatches": "لە دەقی نووسراوەکان دا نەبینرا",
"pageinfo-category-pages": "ژمارەی پەڕەکان",
"pageinfo-category-subcats": "ژمارەی ژێرپەڕەکان",
"pageinfo-category-files": "ژمارەی پەڕگەکان",
- "skinname-monobook": "مۆنۆ",
- "skinname-vector": "ڤێکتۆر",
"markaspatrolleddiff": "وەک پاس دراو نیشان بکە",
"markaspatrolledtext": "ئەم پەڕەیە وەک پاس دراو نیشان بکە",
"markedaspatrolled": "وەک پاس دراو نیشان کرا",
"qbedit": "Mudificà",
"qbpageoptions": "Issa pagina",
"qbmyoptions": "E mo pagine",
- "vector-action-addsection": "Aghjunghje discussione",
- "vector-action-delete": "Supprimà",
- "vector-action-move": "Cullucà",
- "vector-action-protect": "Pruteghje",
- "vector-action-unprotect": "Cambià a prutezzione",
- "vector-view-create": "Creà",
- "vector-view-edit": "Mudificà",
- "vector-view-history": "Vede a cronolugia",
- "vector-view-view": "Leghje",
- "vector-view-viewsource": "Vede a surghjente",
"actions": "Azzione",
"variants": "Variante",
"errorpagetitle": "Errore",
"filehist-dimensions": "Dimensione",
"filehist-comment": "Cummentu",
"imagelinks": "Usu di u schedariu",
+ "sharedupload": "'Ssu file pruvene da $1 è pò esse imprudatu da altri prugetti.",
"filerevert-comment": "Mutivu:",
"filedelete-comment": "Mutivu:",
"filedelete-submit": "Supprimà",
"qbmyoptions": "Саифелерим",
"faq": "Сыкъ берильген суаллер",
"faqpage": "Project:Сыкъ берильген суаллер",
- "vector-action-addsection": "Мевзу къош",
- "vector-action-delete": "Ёкъ эт",
- "vector-action-move": "Адыны денъиштир",
- "vector-action-protect": "Къорчала",
- "vector-action-undelete": "Янъыдан ярат",
- "vector-action-unprotect": "Къорчалавны денъиштир",
- "vector-view-create": "Ярат",
- "vector-view-edit": "Денъиштир",
- "vector-view-history": "Кечмишини косьтер",
- "vector-view-view": "Окъу",
- "vector-view-viewsource": "Менба кодуны косьтер",
"actions": "Арекетлер",
"namespaces": "Исим фезалары",
"variants": "Вариантлар",
"diff-multi-manyusers": "($2-ден зияде {{PLURAL:$2|1=къулланыджы|къулланыджы}}нынъ япкъан {{PLURAL:$1|1=бир ара версиясы|$1 ара версиясы}} косьтерильмей)",
"searchresults": "Къыдырув нетиджелери",
"searchresults-title": "«$1» ичюн къыдырув нетиджелери",
- "toomanymatches": "Пек чокъ эшлешме чыкъты, лютфен, башкъа бир соратма сайланъыз.",
"titlematches": "Макъале ады бир келе",
"textmatches": "Саифе метни бир келе",
"notextmatches": "Ич бир саифеде тапыламады",
"tooltip-upload": "Юкленип башла",
"tooltip-rollback": "\"Кери къайтув\" сычаннен бир басув вастасынен бу саифени сонъки денъиштиргеннинъ денъишикликлерини кери ала",
"tooltip-undo": "\"Кери ал\" бу денъишикликни кери ала ве денъишиклик пенджересини бакъып чыкъув режиминде ача. Кери алувнынъ себебини бильдирмеге изин бере.",
- "monobook.css": "/* monobook темасынынъ аярларыны (настройкаларыны) денъиштирмек ичюн бу ерини денъиштиринъиз. Бутюн сайтта тесирли олур. */",
"anonymous": "{{SITENAME}} сайтынынъ {{PLURAL:$1|1=1|$1}} къайдсыз (аноним) къулланыджысы",
"siteuser": "{{SITENAME}} сайтынынъ къулланыджысы $1",
"anonuser": "{{SITENAME}} сайтынынъ къайдсыз (аноним) къулланыджысы $1",
"spambot_username": "Спамдан темизлев",
"spam_reverting": "$1 сайтына багълантысы олмагъан сонъки версиягъа кери кетирюв",
"spam_blanking": "Бар олгъан версияларда $1 сайтына багълантылар бар, темизлев",
- "skinname-monobook": "MonoBook",
"patrol-log-page": "Тешкерюв журналы",
"log-show-hide-patrol": "Тешкерюв журналыны $1",
"deletedrevision": "$1 сайылы эски версия ёкъ этильди.",
"qbmyoptions": "Saifelerim",
"faq": "Sıq berilgen sualler",
"faqpage": "Project:Sıq berilgen sualler",
- "vector-action-addsection": "Mevzu qoş",
- "vector-action-delete": "Yoq et",
- "vector-action-move": "Adını deñiştir",
- "vector-action-protect": "Qorçala",
- "vector-action-undelete": "Yañıdan yarat",
- "vector-action-unprotect": "Qorçalavnı deñiştir",
- "vector-view-create": "Yarat",
- "vector-view-edit": "Deñiştir",
- "vector-view-history": "Keçmişini köster",
- "vector-view-view": "Oqu",
- "vector-view-viewsource": "Menba kodunı köster",
"actions": "Areketler",
"namespaces": "İsim fezaları",
"variants": "Variantlar",
"diff-multi-manyusers": "($2-den ziyade {{PLURAL:$2|qullanıcı|qullanıcı}}nıñ yapqan {{PLURAL:$1|bir ara versiyası|$1 ara versiyası}} kösterilmey)",
"searchresults": "Qıdıruv neticeleri",
"searchresults-title": "\"$1\" içün qıdıruv neticeleri",
- "toomanymatches": "Pek çoq eşleşme çıqtı, lütfen, başqa bir soratma saylañız",
"titlematches": "Saife adı bir kele",
"textmatches": "Saife metni bir kele",
"notextmatches": "İç bir saifede tapılamadı",
"tooltip-upload": "Yüklenip başla",
"tooltip-rollback": "\"Keri qaytuv\" sıçannen bir basuv vastasınen bu saifeni soñki deñiştirgenniñ deñişikliklerini keri ala",
"tooltip-undo": "\"Keri al\" bu deñişiklikni keri ala ve deñişiklik penceresini baqıp çıquv rejiminde aça. Keri aluvnıñ sebebini bildirmege izin bere.",
- "monobook.css": "/* monobook temasınıñ ayarlarını (nastroykalarını) deñiştirmek içün bu yerini deñiştiriñiz. Bütün saytta tesirli olur. */",
"anonymous": "{{SITENAME}} saytınıñ {{PLURAL:$1|1|$1}} qaydsız (anonim) qullanıcıları",
"siteuser": "{{SITENAME}} saytınıñ qullanıcısı $1",
"anonuser": "{{SITENAME}} saytınıñ qaydsız (anonim) qullanıcısı $1",
"spambot_username": "Spamdan temizlev",
"spam_reverting": "$1 saytına bağlantısı olmağan soñki versiyağa keri ketirüv",
"spam_blanking": "Bar olğan versiyalarda $1 saytına bağlantılar bar, temizlev",
- "skinname-monobook": "MonoBook",
"patrol-log-page": "Teşkerüv jurnalı",
"log-show-hide-patrol": "Teşkerüv jurnalını $1",
"deletedrevision": "$1 sayılı eski versiya yoq etildi.",
"qbmyoptions": "Moje stránky",
"faq": "Často kladené otázky",
"faqpage": "Project:Často kladené otázky",
- "vector-action-addsection": "Přidat téma",
- "vector-action-delete": "Smazat",
- "vector-action-move": "Přesunout",
- "vector-action-protect": "Zamknout",
- "vector-action-undelete": "Obnovit",
- "vector-action-unprotect": "Změnit zámek",
- "vector-view-create": "Založit",
- "vector-view-edit": "Editovat",
- "vector-view-history": "Zobrazit historii",
- "vector-view-view": "Číst",
- "vector-view-viewsource": "Zobrazit zdrojový kód",
"actions": "Akce",
- "vector-more-actions": "Další",
"namespaces": "Jmenné prostory",
"variants": "Varianty",
"navigation-heading": "Navigační menu",
"difference-missing-revision": "{{PLURAL:$2|Jedna z revizí|$2 revize|$2 revizí}} k požadovanému porovnání ($1) {{PLURAL:$2|neexistuje|neexistují|neexistuje}}.\n\nToto je obvykle způsobeno tím, že jste následovali zastaralý odkaz na historickou verzi stránky, jež byla smazána.\nPodrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} knize smazaných stránek].",
"searchresults": "Výsledky hledání",
"searchresults-title": "Výsledky hledání „$1“",
- "toomanymatches": "Požadavku odpovídá příliš mnoho záznamů, zkuste jiný dotaz.",
"titlematches": "Stránky s odpovídajícím názvem",
"textmatches": "Stránky s odpovídajícím textem",
"notextmatches": "Žádné stránky textem neodpovídají.",
"tooltip-summary": "Zadejte stručné shrnutí",
"interlanguage-link-title": "$1 – $2",
"common.css": "/* Zde uvedené CSS bude ovlivňovat všechny styly */",
- "monobook.css": "/* Zde uvedené CSS bude ovlivňovat pouze styl „Monobook“ */",
- "vector.css": "/* Zde uvedené CSS bude ovlivňovat pouze styl „Vektor“ */",
"print.css": "/* Zde uvedené CSS bude ovlivňovat tiskový výstup */",
"noscript.css": "/* Zde uvedené CSS bude ovlivňovat uživatele s vypnutým JavaScriptem */",
"group-autoconfirmed.css": "/* Zde uvedené CSS bude ovlivňovat pouze automaticky schválené uživatele */",
"group-sysop.css": "/* Zde uvedené CSS bude ovlivňovat pouze správce */",
"group-bureaucrat.css": "/* Zde uvedené CSS bude ovlivňovat pouze byrokraty */",
"common.js": "/* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky. */",
- "monobook.js": "/* JavaScript pro uživatele používající vzhled MonoBook */",
- "vector.js": "/* JavaScript pro uživatele používající vzhled „Vektor“ */",
"group-autoconfirmed.js": "/* Zde uvedený JavaScript bude použit pouze pro automaticky schválené uživatele */",
"group-user.js": "/* Zde uvedený JavaScript bude použit pouze pro registrované uživatele */",
"group-bot.js": "/* Zde uvedený JavaScript bude použit pouze pro boty */",
"pageinfo-category-pages": "Počet stránek",
"pageinfo-category-subcats": "Počet podkategorií",
"pageinfo-category-files": "Počet souborů",
- "skinname-vector": "Vektor",
"markaspatrolleddiff": "Označit jako prověřené",
"markaspatrolledtext": "Označit tuto stránku jako prověřenou",
"markedaspatrolled": "Označeno jako prověřené",
"vector-view-view": "чьтѥниѥ",
"vector-view-viewsource": "страницѧ источьнъ обраꙁъ",
"actions": "дѣиства",
+ "vector-more-actions": "вѧщє",
"namespaces": "имєнъ просторꙑ",
"errorpagetitle": "блаꙁна",
"tagline": "{{grammar:genitive|{{SITENAME}}}} страница",
"qbmyoptions": "Fy nhudalennau",
"faq": "Cwestiynau cyffredin",
"faqpage": "Project:Cwestiynau cyffredin",
- "vector-action-addsection": "Ychwanegu adran",
- "vector-action-delete": "Dileu",
- "vector-action-move": "Symud",
- "vector-action-protect": "Diogelu",
- "vector-action-undelete": "Adfer",
- "vector-action-unprotect": "Newid y diogelwch",
- "vector-view-create": "Dechrau",
- "vector-view-edit": "Golygu",
- "vector-view-history": "Gweld yr hanes",
- "vector-view-view": "Darllen",
- "vector-view-viewsource": "Dangos côd y dudalen",
"actions": "Gweithrediadau",
"namespaces": "Parthau",
"variants": "Amrywiolion",
"difference-missing-revision": "Ni chafwyd hyd i $1 {{PLURAL:$2|diwygiad|diwygiad|ddiwygiad|diwygiad}} o'r gwahaniaeth ($1) {{PLURAL:$2|hwn}}.\n\nFel arfer, fe ddigwydd hyn pan mae person wedi dilyn hen gyswllt gwahaniaeth i dudalen sydd erbyn hyn wedi cael ei ddileu.\nMae manylion pellach i'w cael yn [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} lòg y dileuon].",
"searchresults": "Canlyniadau'r chwiliad",
"searchresults-title": "Canlyniadau chwilio am \"$1\"",
- "toomanymatches": "Cafwyd hyd i ormod o enghreifftiau o'r term chwilio; ceisiwch chwilio am derm arall",
"titlematches": "Teitlau erthygl yn cyfateb",
"textmatches": "Testun erthygl yn cyfateb",
"notextmatches": "Does dim testun yn cyfateb",
"qbmyoptions": "Mine indstillinger",
"faq": "OSS",
"faqpage": "Project:OSS",
- "vector-action-addsection": "Nyt emne",
- "vector-action-delete": "Slet",
- "vector-action-move": "Flyt",
- "vector-action-protect": "Beskyt",
- "vector-action-undelete": "Gendan",
- "vector-action-unprotect": "Ændr beskyttelse",
- "vector-view-create": "Opret",
- "vector-view-edit": "Redigér",
- "vector-view-history": "Se historik",
- "vector-view-view": "Læs",
- "vector-view-viewsource": "Se kilden",
"actions": "Handlinger",
"namespaces": "Navnerum",
"variants": "Varianter",
"difference-missing-revision": "{{PLURAL:$2|En revision|$2 revisioner}} af denne forskel ($1) {{PLURAL:$2|blev|blev}} ikke fundet.\n\nDette skyldes normalt et forældet diff link til en side der er slettet.\nDetaljer kan findes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletningsloggen].",
"searchresults": "Søgeresultater",
"searchresults-title": "Søgeresultater for \"$1\"",
- "toomanymatches": "Søgningen fandt for mange sider. Prøv venligst med en anden søgning.",
"titlematches": "Artikeltitler der opfyldte forespørgslen",
"textmatches": "Artikeltekster der opfyldte forespørgslen",
"notextmatches": "Ingen artikeltekster opfyldte forespørgslen",
"tooltip-preferences-save": "Gem indstillinger",
"tooltip-summary": "Indtast en kort opsummering",
"common.css": "/** CSS inkluderet her vil være aktivt for alle brugere. */",
- "monobook.css": "/** CSS inkluderet her vil være aktivt for brugere af Monobook-temaet . */",
"common.js": "/* Javascript inkluderet her vil være aktivt for alle brugere. */",
- "monobook.js": "/* JavaScript i denne fil vil indlæses for brugere af udseendet MonoBook */",
"anonymous": "{{PLURAL:$1|Anonym bruger|Anonyme brugere}} på {{SITENAME}}",
"siteuser": "{{SITENAME}} bruger $1",
"anonuser": "{{SITENAME}} anonym bruger $1",
"pageinfo-category-pages": "Antal sider",
"pageinfo-category-subcats": "Antal underkategorier",
"pageinfo-category-files": "Antal filer",
- "skinname-monobook": "MonoBook",
"markaspatrolleddiff": "Markér som patruljeret",
"markaspatrolledtext": "Markér denne side som patruljeret",
"markedaspatrolled": "Markeret som patruljeret",
"qbmyoptions": "Meine Seiten",
"faq": "Häufig gestellte Fragen",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Abschnitt hinzufügen",
- "vector-action-delete": "Löschen",
- "vector-action-move": "Verschieben",
- "vector-action-protect": "Schützen",
- "vector-action-undelete": "Wiederherstellen",
- "vector-action-unprotect": "Seitenschutz ändern",
- "vector-view-create": "Erstellen",
- "vector-view-edit": "Bearbeiten",
- "vector-view-history": "Versionsgeschichte",
- "vector-view-view": "Lesen",
- "vector-view-viewsource": "Quelltext anzeigen",
"actions": "Aktionen",
- "vector-more-actions": "Mehr",
"namespaces": "Namensräume",
"variants": "Varianten",
"navigation-heading": "Navigationsmenü",
"mergehistory-empty": "Es können keine Versionen vereinigt werden.",
"mergehistory-success": "{{PLURAL:$3|1 Version|$3 Versionen}} von „[[:$1]]“ erfolgreich nach „[[:$2]]“ vereinigt.",
"mergehistory-fail": "Versionsvereinigung nicht möglich, bitte prüfe die Seite und die Zeitangaben.",
+ "mergehistory-fail-toobig": "Die Versionsgeschichtenzusammenführung konnte nicht ausgeführt werden, da sonst mehr als {{PLURAL:$1|eine Version|$1 Versionen}} verschoben werden {{PLURAL:$1|würde|würden}}.",
"mergehistory-no-source": "Ursprungsseite „$1“ ist nicht vorhanden.",
"mergehistory-no-destination": "Zielseite „$1“ ist nicht vorhanden.",
"mergehistory-invalid-source": "Ursprungsseite muss ein gültiger Seitenname sein.",
"difference-missing-revision": "{{PLURAL:$2|Eine Version|$2 Versionen}} dieser Unterschiedsanzeige ($1) {{PLURAL:$2|wurde|wurden}} nicht gefunden.\n\nDieser Fehler wird normalerweise von einem veralteten Link zur Versionsgeschichte einer Seite verursacht, die zwischenzeitlich gelöscht wurde.\nEinzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch] vorhanden.",
"searchresults": "Suchergebnisse",
"searchresults-title": "Suchergebnisse für „$1“",
- "toomanymatches": "Die Anzahl der Suchergebnisse ist zu groß, bitte versuche eine andere Abfrage.",
"titlematches": "Übereinstimmungen mit Seitentiteln",
"textmatches": "Übereinstimmungen mit Inhalten",
"notextmatches": "Keine Übereinstimmungen mit Inhalten",
"largefileserver": "Die Datei ist größer als die vom Server eingestellte Maximalgröße.",
"emptyfile": "Die hochgeladene Datei ist leer. Der Grund kann ein Tippfehler im Dateinamen sein. Bitte kontrolliere, ob du die Datei wirklich hochladen willst.",
"windows-nonascii-filename": "Dieses Wiki unterstützt keine Dateinamen, die Sonderzeichen enthalten.",
- "fileexists": "Eine Datei dieses Namens ist bereits vorhanden. Bitte prüfe <strong>[[:$1]]</strong>, sofern du dir nicht sicher bist, ob du sie ändern möchtest.\n[[$1|thumb]]",
+ "fileexists": "Eine Datei dieses Namens ist bereits vorhanden. Bitte prüfe <strong>[[:$1]]</strong>, sofern {{GENDER:|du}} dir nicht sicher bist, ob du sie ändern möchtest.\n[[$1|thumb]]",
"filepageexists": "Eine Beschreibungsseite wurde bereits als <strong>[[:$1]]</strong> erstellt, es ist aber keine Datei mit diesem Namen vorhanden.\nDie eingegebene Beschreibung wird nicht auf die Beschreibungsseite übernommen.\nDie Beschreibungsseite musst du nach dem Hochladen der Datei noch manuell bearbeiten.\n[[$1|thumb]]",
- "fileexists-extension": "Eine Datei ähnlichen Namens ist bereits vorhanden: [[$2|thumb]]\n* Name der hochzuladenden Datei: <strong>[[:$1]]</strong>\n* Name der bereits vorhandenen Datei: <strong>[[:$2]]</strong>\nBitte wähle einen anderen Namen.",
+ "fileexists-extension": "Eine Datei ähnlichen Namens ist bereits vorhanden: [[$2|thumb]]\n* Name der hochzuladenden Datei: <strong>[[:$1]]</strong>\n* Name der bereits vorhandenen Datei: <strong>[[:$2]]</strong>\nMöchtest du vielleicht einen eindeutigeren Namen verwenden?",
"fileexists-thumbnail-yes": "Bei der Datei scheint es sich um ein Bild verringerter Größe ''(Miniatur)'' zu handeln. [[$1|thumb]]\nBitte prüfe die Datei <strong>[[:$1]]</strong>.\nWenn es sich um das Bild in Originalgröße handelt, so braucht kein separates Vorschaubild hochgeladen zu werden.",
"file-thumbnail-no": "Der Dateiname beginnt mit <strong>$1</strong>. Dies deutet auf ein Bild verringerter Größe ''(Minitatur)'' hin.\nBitte prüfe, ob du das Bild in voller Auflösung vorliegen hast und lade dieses unter dem Originalnamen hoch.",
"fileexists-forbidden": "Unter diesem Namen existiert bereits eine Datei und sie kann nicht überschrieben werden. Bitte gehe zurück und lade die Datei unter einem anderen Namen hoch. [[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "Das Löschen und Wiederherstellen von Dateien ist aufgrund von Wartungsarbeiten vorübergehend deaktiviert.",
"filedelete-maintenance-title": "Die Datei kann nicht gelöscht werden.",
"mimesearch": "Suche nach MIME-Typ",
- "mimesearch-summary": "Auf dieser Spezialseite können die Dateien nach dem MIME-Typ gefiltert werden. Die Eingabe muss immer den Medien- und Subtyp beinhalten: <code>image/jpeg</code> (siehe Dateibeschreibungsseite).",
+ "mimesearch-summary": "Auf dieser Spezialseite können die Dateien nach dem MIME-Typ gefiltert werden.\nDie Eingabe muss immer den Medien- und Subtyp beinhalten: <code>image/jpeg</code> oder <code>image/*</code> (siehe Dateibeschreibungsseite).",
"mimetype": "MIME-Typ:",
"download": "Herunterladen",
"unwatchedpages": "Nicht beobachtete Seiten",
"tooltip-preferences-save": "Einstellungen speichern",
"tooltip-summary": "Gib eine kurze Zusammenfassung ein.",
"interlanguage-link-title": "$1 – $2",
+ "interlanguage-link-title-nonlang": "$1 – $2",
"common.css": "/* Das folgende CSS wird für alle Benutzeroberflächen geladen. */",
- "monobook.css": "/* Das folgende CSS wird für Benutzer der MonoBook-Benutzeroberfläche geladen */",
- "vector.css": "/* Das folgende CSS wird für Benutzer der Vector-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */",
"print.css": "/* Das folgende CSS wird in der Druckausgabe geladen. */",
"noscript.css": "/* Das folgende CSS wirkt sich für Benutzer aus, die JavaScript deaktiviert haben */",
"group-autoconfirmed.css": "/* CSS an dieser Stelle wirkt sich nur auf automatisch bestätigte Benutzer aus */",
"group-sysop.css": "/* CSS an dieser Stelle wirkt sich nur auf Administratoren aus */",
"group-bureaucrat.css": "/* Das folgende CSS wird nur für Bürokraten geladen. */",
"common.js": "/* Das folgende JavaScript wird für alle Benutzer geladen. */",
- "monobook.js": "/* Das folgende JavaScript wird für Benutzer der Monobook-Benutzeroberfläche geladen. */",
- "vector.js": "/* Das folgende JavaScript wird für Benutzer der Vector-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */",
"group-autoconfirmed.js": "/* Das folgende JavaScript wird nur für automatisch bestätigte Benutzer geladen. */",
"group-user.js": "/* Das folgende JavaScript wird nur für angemeldete Benutzer geladen. */",
"group-bot.js": "/* Das folgende JavaScript wird nur für Bots geladen. */",
"pageinfo-category-pages": "Anzahl der Seiten",
"pageinfo-category-subcats": "Anzahl der Unterkategorien",
"pageinfo-category-files": "Anzahl der Dateien",
- "skinname-monobook": "MonoBook",
- "skinname-vector": "Vector",
"markaspatrolleddiff": "Als kontrolliert markieren",
"markaspatrolledtext": "Diese Seite als kontrolliert markieren",
"markedaspatrolled": "Als kontrolliert markiert",
"version-hook-name": "Schnittstellenname",
"version-hook-subscribedby": "Aufruf von",
"version-version": "($1)",
+ "version-no-ext-name": "[kein Name]",
"version-svn-revision": "(Version $2)",
"version-license": "MediaWiki-Lizenz",
"version-ext-license": "Lizenz",
"version-ext-colheader-license": "Lizenz",
"version-ext-colheader-description": "Beschreibung",
"version-ext-colheader-credits": "Autoren",
- "version-license-title": "Lizenz für $1",
- "version-license-not-found": "Es wurden keine detaillierten Lizenzinformationen für diese Erweiterung gefunden.",
+ "version-license-title": "Lizenz für „$1“",
+ "version-license-not-found": "Es wurden keine detaillierten Lizenzinformationen zu dieser Erweiterung gefunden.",
"version-credits-title": "Danksagungen für $1",
"version-credits-not-found": "Es wurden keine detaillierten Danksagungsinformationen für diese Erweiterung gefunden.",
"version-poweredby-credits": "Diese Website nutzt '''[https://www.mediawiki.org/wiki/MediaWiki/de MediaWiki]''', Copyright © 2001–$1 $2.",
"qbmyoptions": "Pelê mı",
"faq": "PZP (Persê ke zehf persiyenê)",
"faqpage": "Project: PZP",
- "vector-action-addsection": "Mewzu vıraze",
- "vector-action-delete": "Bestere",
- "vector-action-move": "Bere",
- "vector-action-protect": "Bışevekne",
- "vector-action-undelete": "Esterıtışi peyser bıgê",
- "vector-action-unprotect": "Starkerdışi bıvurne",
- "vector-view-create": "Vıraze",
- "vector-view-edit": "Bıvurne",
- "vector-view-history": "Tarixê pele bıvêne",
- "vector-view-view": "Bıwane",
- "vector-view-viewsource": "Çımey bıvêne",
"actions": "Hereketi",
- "vector-more-actions": "Zêde",
"namespaces": "Heruna naman",
"variants": "Varyanti",
"navigation-heading": "Menuyê navigasyoni",
"difference-missing-revision": "Ferqê {{PLURAL:$2|Yew rewizyonê|$2 rewizyonê}} {{PLURAL:$2|dı|dı}} ($1) sero çıniyo.\n\nNo normal de werênayış dê pelanê besterneyan dı ena xırabin asena.\nDetayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} tiya dı] aseno.",
"searchresults": "Neticeyê geyrayışi",
"searchresults-title": "Qandê \"$1\" neticeyê geyrayışi",
- "toomanymatches": "Zêde teki (zewci) peyser çarnay, şıma rê zehmet, be persê do bin ra bıcerrebnên.",
"titlematches": "Tekê (zewcê) sernameyê pele",
"textmatches": "Tekê (zewcê) nuştey pele",
"notextmatches": "tekê (zewcê) nuştey pele çıniyê",
"pageinfo-category-pages": "Amarê pelan",
"pageinfo-category-subcats": "Amarê bınkategoriyan",
"pageinfo-category-files": "Amarê dosyeyan",
- "skinname-monobook": "MonoBook",
- "skinname-vector": "Vektor",
"markaspatrolleddiff": "Nişan bıke ke dewriya biyo",
"markaspatrolledtext": "Ena pele nişan bike ke devriye biyo",
"markedaspatrolled": "Nişan biyo ke verni de devriye biyo",
"qbmyoptions": "Móje boki",
"faq": "FAQ (pšašanja a wótegrona)",
"faqpage": "Project:FAQ (pšašanja a wótegrona)",
- "vector-action-addsection": "Temu pśidaś",
- "vector-action-delete": "Wulašowaś",
- "vector-action-move": "Pśesunuś",
- "vector-action-protect": "Šćitaś",
- "vector-action-undelete": "Wótnowiś",
- "vector-action-unprotect": "Šćit změniś",
- "vector-view-create": "Napóraś",
- "vector-view-edit": "Wobźěłaś",
- "vector-view-history": "Wersije a awtory",
- "vector-view-view": "Cytaś",
- "vector-view-viewsource": "Žrědło se woglědaś",
"actions": "Akcije",
"namespaces": "Mjenjowe rumy",
"variants": "Warianty",
"difference-missing-revision": "{{PLURAL:$2|Jadna wersija|$2 wersiji|$2 wersije|$2 wersijow}} toś togo rozdźěla ($1) {{PLURAL:$2|njejo se namakała|njejstej se namakałej|njejsu namakali|njejo se namakało}}.\n\nPśicyna jo zwětšego zestarjony diferencny wótkaz k bokoju, kótaryž jo se wulašował.\nDrobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokolu wulašowanjow] namakaś.",
"searchresults": "Wuslědki pytanja",
"searchresults-title": "Pytańske wuslědki za \"$1\"",
- "toomanymatches": "Pśewjele pytańskich wuslědkow, pšosym wopytaj druge wótpšašanje.",
"titlematches": "boki z wótpowědujucym napismom",
"textmatches": "Boki z wótpowědujucym tekstom",
"notextmatches": "Boki z wótpowědujucym tekstom njeeksistěruju.",
"tooltip-summary": "Zapódaj krotke zespominanje",
"interlanguage-link-title": "$1 – $2",
"common.css": "/** Na toś tom městnje wustatkujo se CSS na wšykne šaty. */",
- "monobook.css": "/* How zaměstnjony CSS wustatkujo se na wužywarje monobook-šata */",
"common.js": "/* Kuždy JavaScript how lodujo se za wšykne wužywarje na kuždem boce. */",
- "monobook.js": "/* Slědujucy JavaScript zacytajo se za wužywarjow, kótarež skin MonoBook wužywaju */",
"anonymous": "{{PLURAL:$1|Anonymny wužywaŕ|Anonymnej wužywarja|Anonymne wužywarje}} na {{SITENAME}}",
"siteuser": "{{SITENAME}}-wužywaŕ $1",
"anonuser": "{{SITENAME}} anonymny wužywaŕ $1",
"pageinfo-category-pages": "Licba bokow",
"pageinfo-category-subcats": "Licba pódkategorijow",
"pageinfo-category-files": "Licba datajow",
- "skinname-monobook": "MonoBook",
"markaspatrolleddiff": "Ako kontrolěrowane markěrowaś",
"markaspatrolledtext": "Markěruj toś ten bok ako kontrolěrowany",
"markedaspatrolled": "jo se ako kontrolěrowany markěrował",
"qbmyoptions": "Al mē pàgini",
"faq": "Dmândi fâti",
"faqpage": "Project:Dmândi fâti despès",
- "vector-action-addsection": "Zûnta discusiòun",
- "vector-action-delete": "Scanşèla",
- "vector-action-move": "Spôsta",
- "vector-action-protect": "Prutēz",
- "vector-action-undelete": "Fà al recóper",
- "vector-action-unprotect": "Câmbia la prutesiòun",
- "vector-view-create": "Invèinta",
- "vector-view-edit": "Mudéfica",
- "vector-view-history": "Guêrda la stôria",
- "vector-view-view": "Lēş",
- "vector-view-viewsource": "Guêrda la surzéia",
"actions": "Asiòun",
- "vector-more-actions": "Êter",
"namespaces": "Spâsi di nòm",
"variants": "Mudéfichi",
"navigation-heading": "Lésta 'd navigasiòun",
"difference-missing-revision": "{{PLURAL:$2|'Na versiòun|$2 versiòun}} ed cla diferèinsa ché ($1) {{PLURAL:$2|an n'é mìa stêda catêda|în mìa stêdi catêdi}}. \n\nCòst a sucēd ed sôlit quând a's và adrē a un colegamèint vèc ed 'na diff a 'na pàgina scanşlêda. I particulêr a pōlen èser catê int al [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} regéster dal scanşladûri].",
"searchresults": "Rişultê 'd la sērca",
"searchresults-title": "Rişultê 'd la sērca ed \"$1\"",
- "toomanymatches": "Trôpi relasiòun. Cambiêr la dmânda.",
"titlematches": "Rapôrt int al tétol dal pàgini",
"textmatches": "Rapôrt int al tèst dal pàgini",
"notextmatches": "Nisóna relasiòun int al tèst dal pàgini",
"search-result-score": "Impurtânsa: $1%",
"search-redirect": "(redirect $1)",
"search-section": "(sesiòun $1)",
+ "search-file-match": "(relasiòun dèinter al file)",
"search-suggest": "Fōrsi 't serchêv $1",
"search-interwiki-caption": "Prugèt fradē",
"search-interwiki-default": "Rişultêt da $1:",
"search-interwiki-more": "(êter)",
+ "search-relatedarticle": "Rişultêt coleghê",
"searchrelated": "coleghê",
"searchall": "tót",
+ "showingresults": "Ed sègvit {{PLURAL:$1|a vîn preşentê al mâsim <strong>1</strong> rişultêt| a vînen preşentê al mâsim <strong>$1</strong> rişultêt}} a partîr dal nómer #<strong>$2</strong>.",
+ "showingresultsinrange": "{{PLURAL:$1|A vîn mustrê| a vînen mustrê}} sòta {{PLURAL:$1|<strong>1</strong> rişultêt|<strong>$1</strong> rişultêt}} dal #<strong>$2</strong> al #<strong>$3</strong>.",
+ "showingresultsnum": "Ed sègvit {{PLURAL:$1|a vîn preşentê <strong>1</strong> rişultêt| a vînen preşentê <strong>$3</strong> rişultêt}} a partîr dal nómer #<strong>$2</strong>.",
"showingresultsheader": "{{PLURAL:$5|Al risultêt '''$1''' ed '''$3'''|I risultêt '''$1 - $2''' ed '''$3'''}} per '''$4'''",
"search-nonefound": "La sērca an n'à mìa dê di rişultê.",
"powersearch-toggleall": "Tót",
"qbmyoptions": "Οι σελίδες μου",
"faq": "Συχνές ερωτήσεις",
"faqpage": "Project:Συχνές ερωτήσεις",
- "vector-action-addsection": "Προσθήκη θέματος",
- "vector-action-delete": "Διαγραφή",
- "vector-action-move": "Μετακίνηση",
- "vector-action-protect": "Προστασία",
- "vector-action-undelete": "Επαναφορά",
- "vector-action-unprotect": "Αλλαγή προστασίας",
- "vector-view-create": "Δημιουργία",
- "vector-view-edit": "Επεξεργασία",
- "vector-view-history": "Προβολή ιστορικού",
- "vector-view-view": "Ανάγνωση",
- "vector-view-viewsource": "Προβολή κώδικα",
"actions": "Ενέργειες",
- "vector-more-actions": "Περισσότερα",
"namespaces": "Χώροι ονομάτων",
"variants": "Παραλλαγές",
"navigation-heading": "Μενού πλοήγησης",
"difference-missing-revision": "{{PLURAL:$2|Μία αναθεώρηση|$2 αναθεωρήσεις}} αυτής της διαφοράς ($1) δεν {{PLURAL:$2|μπόρεσε να βρεθεί|μπόρεσαν να βρεθούν}}.\n\nΑυτό συνήθως προκαλείται από παλιό σύνδεσμο διαφοράς προς σελίδα που έχει διαγραφεί.\nΛεπτομέρειες θα βρείτε στο [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ημερολόγιο καταγραφής διαγραφών].",
"searchresults": "Αποτελέσματα αναζήτησης",
"searchresults-title": "Αποτελέσματα αναζήτησης για \"$1\"",
- "toomanymatches": "Ανταποκρίνονται πάρα πολλές περιπτώσεις, παρακαλούμε δοκιμάστε μια διαφορετική ερώτηση",
"titlematches": "Τίτλοι άρθρων που ανταποκρίνονται",
"textmatches": "Κείμενα σελίδων που ανταποκρίνονται:",
"notextmatches": "Δεν υπάρχουν αντίστοιχα κείμενα σελίδων.",
"tooltip-preferences-save": "Αποθήκευση προτιμήσεων",
"tooltip-summary": "Εισαγάγετε μια σύντομη σύνοψη",
"common.css": "/* Το τοποθετημένο εδώ CSS θα εφαρμοστεί σε όλα τα skins */",
- "monobook.css": "/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Monobook skin */",
- "vector.css": "/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Vector skin */",
"print.css": "/* Το τοποθετημένο εδώ CSS θα επηρεάσει το αποτέλεσμα της εκτύπωσης */",
"common.js": "/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για όλους τους χρήστες σε κάθε φόρτωση σελίδας. */",
- "monobook.js": "/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το MonoBook skin */",
- "vector.js": "/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Vector skin */",
"anonymous": "{{PLURAL:$1|Ανώνυμος χρήστης|Ανώνυμοι χρήστες}} του {{SITENAME}}",
"siteuser": "{{SITENAME}} χρήστης $1",
"anonuser": "ανώνυμος χρήστης $1 του {{SITENAME}}",
"faqpage": "Project:FAQ",
"sitetitle": "{{SITENAME}}",
"sitesubtitle": "",
- "vector-action-addsection": "Add topic",
- "vector-action-delete": "Delete",
- "vector-action-move": "Move",
- "vector-action-protect": "Protect",
- "vector-action-undelete": "Undelete",
- "vector-action-unprotect": "Change protection",
- "vector-view-create": "Create",
- "vector-view-edit": "Edit",
- "vector-view-history": "View history",
- "vector-view-view": "Read",
- "vector-view-viewsource": "View source",
"actions": "Actions",
- "vector-more-actions": "More",
"namespaces": "Namespaces",
"variants": "Variants",
"navigation-heading": "Navigation menu",
"mergehistory-empty": "No revisions can be merged.",
"mergehistory-success": "$3 {{PLURAL:$3|revision|revisions}} of [[:$1]] successfully merged into [[:$2]].",
"mergehistory-fail": "Unable to perform history merge, please recheck the page and time parameters.",
+ "mergehistory-fail-toobig" : "Unable to perform history merge as more than the limit of $1 {{PLURAL:$1|revision|revisions}} would be moved.",
"mergehistory-no-source": "Source page $1 does not exist.",
"mergehistory-no-destination": "Destination page $1 does not exist.",
"mergehistory-invalid-source": "Source page must be a valid title.",
"search-summary": "",
"searchresults": "Search results",
"searchresults-title": "Search results for \"$1\"",
- "toomanymatches": "Too many matches were returned, please try a different query",
"titlematches": "Page title matches",
"textmatches": "Page text matches",
"notextmatches": "No page text matches",
"windows-nonascii-filename": "This wiki does not support filenames with special characters.",
"fileexists": "A file with this name exists already, please check <strong>[[:$1]]</strong> if {{GENDER:|you}} are not sure if you want to change it.\n[[$1|thumb]]",
"filepageexists": "The description page for this file has already been created at <strong>[[:$1]]</strong>, but no file with this name currently exists.\nThe summary you enter will not appear on the description page.\nTo make your summary appear there, you will need to manually edit it.\n[[$1|thumb]]",
- "fileexists-extension": "A file with a similar name exists: [[$2|thumb]]\n* Name of the uploading file: <strong>[[:$1]]</strong>\n* Name of the existing file: <strong>[[:$2]]</strong>\nPlease choose a different name.",
+ "fileexists-extension": "A file with a similar name exists: [[$2|thumb]]\n* Name of the uploading file: <strong>[[:$1]]</strong>\n* Name of the existing file: <strong>[[:$2]]</strong>\nDo you perhaps want to use a more distinctive name?",
"fileexists-thumbnail-yes": "The file seems to be an image of reduced size <em>(thumbnail)</em>.\n[[$1|thumb]]\nPlease check the file <strong>[[:$1]]</strong>.\nIf the checked file is the same image of original size it is not necessary to upload an extra thumbnail.",
"file-thumbnail-no": "The filename begins with <strong>$1</strong>.\nIt seems to be an image of reduced size <em>(thumbnail)</em>.\nIf you have this image in full resolution upload this one, otherwise change the filename please.",
"fileexists-forbidden": "A file with this name already exists, and cannot be overwritten.\nIf you still want to upload your file, please go back and use a new name.\n[[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "Deletion and restoration of files temporarily disabled during maintenance.",
"filedelete-maintenance-title": "Cannot delete file",
"mimesearch": "MIME search",
- "mimesearch-summary": "This page enables the filtering of files for their MIME type.\nInput: contenttype/subtype, e.g. <code>image/jpeg</code>.",
+ "mimesearch-summary": "This page enables the filtering of files for their MIME type.\nInput: contenttype/subtype or contenttype/*, e.g. <code>image/jpeg</code>.",
"mimetype": "MIME type:",
"download": "download",
"unwatchedpages": "Unwatched pages",
"tooltip-summary": "Enter a short summary",
"interlanguage-link-title": "$1 – $2",
"interlanguage-link-title-langonly": "$1",
+ "interlanguage-link-title-nonlang": "$1 – $2",
+ "interlanguage-link-title-nonlangonly": "$1",
"common.css": "/* CSS placed here will be applied to all skins */",
- "monobook.css": "/* CSS placed here will affect users of the MonoBook skin */",
- "vector.css": "/* CSS placed here will affect users of the Vector skin */",
"print.css": "/* CSS placed here will affect the print output */",
"noscript.css": "/* CSS placed here will affect users with JavaScript disabled */",
"group-autoconfirmed.css": "/* CSS placed here will affect autoconfirmed users only */",
"group-sysop.css": "/* CSS placed here will affect sysops only */",
"group-bureaucrat.css": "/* CSS placed here will affect bureaucrats only */",
"common.js": "/* Any JavaScript here will be loaded for all users on every page load. */",
- "monobook.js": "/* Any JavaScript here will be loaded for users using the MonoBook skin */",
- "vector.js": "/* Any JavaScript here will be loaded for users using the Vector skin */",
"group-autoconfirmed.js": "/* Any JavaScript here will be loaded for autoconfirmed users only */",
"group-user.js": "/* Any JavaScript here will be loaded for registered users only */",
"group-bot.js": "/* Any JavaScript here will be loaded for bots only */",
"pageinfo-category-pages": "Number of pages",
"pageinfo-category-subcats": "Number of subcategories",
"pageinfo-category-files": "Number of files",
- "skinname-monobook": "MonoBook",
- "skinname-vector": "Vector",
"markaspatrolleddiff": "Mark as patrolled",
"markaspatrolledlink": "[$1]",
"markaspatrolledtext": "Mark this page as patrolled",
"version-hook-name": "Hook name",
"version-hook-subscribedby": "Subscribed by",
"version-version": "($1)",
+ "version-no-ext-name": "[no name]",
"version-svn-revision": "r$1",
"version-license": "MediaWiki License",
"version-ext-license": "License",
"category_header": "Artikoloj en kategorio \"$1\"",
"subcategories": "Subkategorioj",
"category-media-header": "Dosieroj en kategorio \"$1\"",
- "category-empty": "''Ĉi tiu kategorio momente ne enhavas artikolojn aŭ mediojn.''",
+ "category-empty": "<em>Tiu ĉi kategorio nuntempe enhavas neniun artikolon aŭ plurmedian dosieron.</em>",
"hidden-categories": "{{PLURAL:$1|Kaŝita kategorio|Kaŝitaj kategorioj}}",
"hidden-category-category": "Kaŝitaj kategorioj",
"category-subcat-count": "{{PLURAL:$2|Ĉi tiu kategorio havas nur la jenan subkategorion.|Ĉi tiu kategorio havas la {{PLURAL:$1|jenan subkategorion|$1 jenajn subkategoriojn}}, el $2 entute.}}",
"qbmyoptions": "Miaj paĝoj",
"faq": "Oftaj demandoj",
"faqpage": "Project:Oftaj demandoj",
- "vector-action-addsection": "Aldoni temon",
- "vector-action-delete": "Forigi",
- "vector-action-move": "Alinomigi",
- "vector-action-protect": "Protekti",
- "vector-action-undelete": "Malforigi",
- "vector-action-unprotect": "Ŝanĝi protektadon",
- "vector-view-create": "Krei",
- "vector-view-edit": "Redakti",
- "vector-view-history": "Vidi historion",
- "vector-view-view": "Legi",
- "vector-view-viewsource": "Vidi fonton",
"actions": "Agoj",
- "vector-more-actions": "Pli",
"namespaces": "Nomspacoj",
"variants": "Variantoj",
"navigation-heading": "Navigacia menuo",
"undo-nochange": "Ŝajne la redakto jam estis malfarita.",
"undo-summary": "Nuligis version $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskuto]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])",
"undo-summary-username-hidden": "Malfari ŝanĝon $1 de kaŝita uzulo",
- "cantcreateaccounttitle": "Ne povas krei konton",
+ "cantcreateaccounttitle": "Ne eblas krei konton",
"cantcreateaccount-text": "Konto-kreado de ĉi tiu IP-adreso ('''$1''') estis forbarita de [[User:$3|$3]].\n\nLa kialo donata de $3 estas ''$2''.",
"cantcreateaccount-range-text": "La kreado de kontoj de IP-adresoj en la intervalo '''$1''', kiu inkludas vian IP-adreson ('''$4'''), estis blokita de [[User:$3|$3]].\n\nLa donita kialo de $3 estas ''$2''",
"viewpagelogs": "Rigardi la protokolojn por tiu ĉi paĝo",
"difference-missing-revision": "{{PLURAL:$2|Unu revizio|$2 revizioj}} de ĉi tiu malsameco ($1) ne {{PLURAL:$2|estis|estis}} trovebla.\n\nLa kutima kaŭzo estas sekvi malaktualan malsamo-ligilon al paĝo forviŝita.\nDetaloj troveblos en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de forviŝoj].",
"searchresults": "Serĉrezultoj",
"searchresults-title": "Serĉrezultoj por \"$1\"",
- "toomanymatches": "Tro da serĉo-trafoj estis trovitaj; bonvolu provi malsaman serĉomendon.",
"titlematches": "Trovitaj laŭ titolo",
"textmatches": "Trovitaj laŭ enhavo",
"notextmatches": "Neniu trovita laŭ enhavo",
"datedefault": "Nenia prefero",
"prefs-labs": "Ecoj el Laboratorio",
"prefs-user-pages": "Uzantopaĝoj",
- "prefs-personal": "Uzanta profilo",
+ "prefs-personal": "Profilo de uzanto",
"prefs-rc": "Lastaj ŝanĝoj",
"prefs-watchlist": "Atentaro",
"prefs-watchlist-days": "Kiom da tagoj montriĝu en la atentaro:",
"timezoneregion-europe": "Eŭropo",
"timezoneregion-indian": "Hinda Oceano",
"timezoneregion-pacific": "Pacifiko",
- "allowemail": "Rajtigi retmesaĝojn de aliaj uzantoj",
+ "allowemail": "Ebligi akceptadon de retmesaĝoj de aliaj uzantoj",
"prefs-searchoptions": "Serĉi",
"prefs-namespaces": "Nomspacoj",
"default": "defaŭlte",
"tooltip-summary": "Enigu mallongan resumon",
"interlanguage-link-title": "$1 — $2",
"common.css": "/* La jena CSS influos la aspekton de ĉiaj temoj. */",
- "monobook.css": "/* La jena CSS influos la paĝaspekton por uzantoj de la Libreja temo. */",
- "vector.css": "/* La jena CSS influos la paĝaspekton por uzantoj de la Vektora temo. */",
"print.css": "/* La jena CSS influos la prezentadon de la presaĵo. */",
"noscript.css": "/* La jena CSS influos uzantojn, kiuj desebligis Ĝavaskripton. */",
"group-autoconfirmed.css": "/* La jena CSS sole influos auxtokonfirmatajn uzantojn. */",
"group-sysop.css": "/* La jena CSS sole influos administrantojn. */",
"group-bureaucrat.css": "/* La jena CSS sole influos burokratojn. */",
"common.js": "/* La jena Ĝavaskripto ŝargiĝos por ĉiaj uzantoj ĉe ĉiu paĝoŝargado. */",
- "monobook.js": "/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Libreja temo. */",
- "vector.js": "/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Vektora temo. */",
"group-autoconfirmed.js": "/* La jena Ĝavaskripto sole ŝargiĝos por auxtokonfirmataj uzantoj. */",
"group-bot.js": "/* La jena Ĝavaskripto sole ŝargiĝos por robotoj. */",
"group-sysop.js": "/* La jena Ĝavaskripto sole ŝargiĝos por administrantoj. */",
"pageinfo-category-pages": "Nombro de paĝoj",
"pageinfo-category-subcats": "Nombro de subkategorioj",
"pageinfo-category-files": "Nombro de dosieroj",
- "skinname-monobook": "Librejo",
- "skinname-vector": "Vektoro",
"markaspatrolleddiff": "Marki kiel patrolitan",
"markaspatrolledtext": "Marki ĉi tiun paĝon kiel patrolitan",
"markedaspatrolled": "Markita kiel patrolita",
"watchlistedit-normal-title": "Redakti atentaron",
"watchlistedit-normal-legend": "Forigi titolojn de atentaro",
"watchlistedit-normal-explain": "Jen titoloj de via atentaro.\nForigi titolon, marku la skatoleto apude de ĝi, kaj klaku \"{{int:Watchlistedit-normal-submit}}\".\nVi ankaŭ povas [[Special:EditWatchlist/raw|redakti la krudan liston]].",
- "watchlistedit-normal-submit": "Forigi Titolojn",
+ "watchlistedit-normal-submit": "Forigi titolojn",
"watchlistedit-normal-done": "{{PLURAL:$1|1 titolo estis forigita|$1 titoloj estis forigitaj}} de via atentaro:",
"watchlistedit-raw-title": "Redakti krudan atentaron",
"watchlistedit-raw-legend": "Redakti krudan atentaron",
"watchlistedit-raw-done": "Via atentaro estas ĝisdatigita.",
"watchlistedit-raw-added": "{{PLURAL:$1|1 titolo estis aldonita|$1 titoloj estis aldonitaj}}:",
"watchlistedit-raw-removed": "{{PLURAL:$1|1 titolo estis forigita|$1 titoloj estis forigitaj}}:",
+ "watchlistedit-clear-title": "Malplenigita atentaro",
+ "watchlistedit-clear-legend": "Malplenigi la atentaron",
+ "watchlistedit-clear-explain": "Ĉiuj el la titoloj estos forigitaj el via atentaro",
+ "watchlistedit-clear-titles": "Titoloj:",
+ "watchlistedit-clear-submit": "Malplenigi la atentaron (Tio estas definitiva!)",
+ "watchlistedit-clear-done": "Via atentaro estas malplenigita.",
+ "watchlistedit-clear-removed": "{{PLURAL:$1|1 titolo estis forigita|$1 titoloj estis forigitaj}}:",
+ "watchlistedit-too-many": "Estas tro da pagoj por montri ĉi tie.",
+ "watchlisttools-clear": "Malplenigi la atentaron",
"watchlisttools-view": "Rigardi koncernajn ŝanĝojn",
"watchlisttools-edit": "Rigardi kaj redakti atentaron",
"watchlisttools-raw": "Redakti krudan atentaron",
"limitreport-templateargumentsize": "Grandeco de argumentoj de ŝablonoj",
"limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bitoko|bitokoj}}",
"limitreport-expensivefunctioncount": "Nombro de kostaj sintaks-analizilaj funkcioj",
- "expandtemplates": "Ampleksigi ŝablonojn",
+ "expandtemplates": "Ŝablonetendilo",
"expand_templates_intro": "Ĉi tiu speciala paĝo traktas tekston kaj ampleksigas ĉiujn ŝablonojn en ĝi rekursie.\nĜi ankaŭ ampleksigas sintaksajn funkciojn kiel\n<code><nowiki>{{</nowiki>#language:…}}</code> kaj variablojn kiel\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>. Fakte preskaŭ iujn ajn en duoblaj krampoj.",
"expand_templates_title": "Kunteksta titolo, por {{FULLPAGENAME}}, ktp.:",
"expand_templates_input": "Enigita teksto:",
"아라",
"Mcervera",
"Wifidel",
- "Macofe"
+ "Macofe",
+ "Koavf"
]
},
"tog-underline": "Subrayar los enlaces:",
"qbmyoptions": "Mis páginas",
"faq": "Preguntas frecuentes",
"faqpage": "Project:P+F",
- "vector-action-addsection": "Nueva sección",
- "vector-action-delete": "Borrar",
- "vector-action-move": "Trasladar",
- "vector-action-protect": "Proteger",
- "vector-action-undelete": "Restaurar",
- "vector-action-unprotect": "Cambiar protección",
- "vector-view-create": "Crear",
- "vector-view-edit": "Editar",
- "vector-view-history": "Ver historial",
- "vector-view-view": "Leer",
- "vector-view-viewsource": "Ver código",
"actions": "Acciones",
- "vector-more-actions": "Más",
"namespaces": "Espacios de nombres",
"variants": "Variantes",
"navigation-heading": "Menú de navegación",
"jumptonavigation": "navegación",
"jumptosearch": "buscar",
"view-pool-error": "Lo sentimos, los servidores están sobrecargados en este momento.\nHay demasiados usuarios que están tratando de ver esta página.\nEspera un momento antes de tratar de acceder nuevamente a esta página.\n\n$1",
- "generic-pool-error": "Lo sentimos, los servidores están sobrecargados por el momento.\nHay demasiados usuarios tratando de ver esta página.\nIntentes acceder nuevamente a esta página dentro de un rato.",
+ "generic-pool-error": "Lo sentimos, los servidores están sobrecargados en este momento.\nHay demasiados usuarios que están tratando de ver este recurso.\nEspera un momento antes de tratar de acceder nuevamente a este recurso.",
"pool-timeout": "Tiempo limite agotado para el bloqueo",
"pool-queuefull": "La cola de trabajo está llena",
"pool-errorunknown": "Error desconocido",
"editlink": "modificar",
"viewsourcelink": "ver código",
"editsectionhint": "Editar sección: $1",
- "toc": "Contenido",
+ "toc": "Contenidos",
"showtoc": "mostrar",
"hidetoc": "ocultar",
"collapsible-collapse": "Contraer",
"nstab-help": "Ayuda",
"nstab-category": "Categoría",
"nosuchaction": "No existe esa acción",
- "nosuchactiontext": "La acción especificada en la dirección no es válida.\nEs posible que hayas escrito mal la URL o que hayas seguido un enlace incorrecto. Esto también podría indicar un error en el software utilizado en {{SITENAME}}.",
+ "nosuchactiontext": "La acción especificada en la URL no es válida.\nEs posible que hayas escrito mal la URL o que hayas seguido un enlace incorrecto.\nEsto también podría indicar un error en el software utilizado en {{SITENAME}}.",
"nosuchspecialpage": "No existe esa página especial",
"nospecialpagetext": "<strong>Ha solicitado una página especial inexistente.</strong>\n\nPuedes ver una lista de las páginas especiales en [[Special:SpecialPages|{{int:specialpages}}]].",
"error": "Error",
"databaseerror": "Error de la base de datos",
- "databaseerror-text": "Ocurrió un error de consulta de la base de datos.\nEsto puede indicar un fallo en el software.",
- "databaseerror-textcl": "Se ha producido un error en la base de datos.",
+ "databaseerror-text": "Ocurrió un error de consulta a la base de datos.\nEsto puede indicar un fallo en el software.",
+ "databaseerror-textcl": "Se ha producido un error de consulta a la base de datos.",
"databaseerror-query": "Consulta: $1",
"databaseerror-function": "Función: $1",
"databaseerror-error": "Error: $1",
- "laggedslavemode": "'''Aviso:''' puede que falten las actualizaciones más recientes en esta página.",
+ "laggedslavemode": "<strong>Avertencia:</strong> puede que falten las actualizaciones más recientes en esta página.",
"readonly": "Base de datos bloqueada",
"enterlockreason": "Explica el motivo del bloqueo, incluyendo una estimación de cuándo se producirá el desbloqueo",
"readonlytext": "La base de datos no permite nuevas entradas u otras modificaciones de forma temporal, probablemente por mantenimiento rutinario, tras lo cual volverá a la normalidad.\n\nLa explicación dada por el administrador que la bloqueó fue: $1",
"missing-article": "La base de datos no encuentra el texto de una página que debería hallarse, llamada «$1» $2.\n\nLa causa de esto suele deberse a un ''diff'' anacrónico o un enlace al historial de una página que ha sido borrada.\n\nSi no fuera el caso, puedes haber encontrado un fallo en el software.\n\nPor favor, avisa a un [[Special:ListUsers/sysop|administrador]], tomando nota de la URL.",
"missingarticle-rev": "(n.º de revisión: $1)",
"missingarticle-diff": "(Dif.: $1, $2)",
- "readonly_lag": "La base de datos se ha bloqueado temporalmente mientras los servidores se sincronizan.",
+ "readonly_lag": "La base de datos se ha bloqueado automáticamente mientras los servidores de base de datos esclavos se sincronizan con el maestro.",
"internalerror": "Error interno",
"internalerror_info": "Error interno: $1",
"filecopyerror": "No se pudo copiar el archivo «$1» a «$2».",
"badtitle": "Título incorrecto",
"badtitletext": "El título de la página solicitada está vacío, no es válido, o es un enlace interidioma o interwiki incorrecto.\nPuede que contenga uno o más caracteres que no se pueden usar en los títulos.",
"perfcached": "Los siguientes datos provienen de la caché y pueden no estar actualizados. La caché puede contener {{PLURAL:$1|un resultado|$1 resultados}} como máximo.",
- "perfcachedts": "Los siguientes datos provienen de la caché y su última fecha y hora de actualización es: $1. La caché puede contener {{PLURAL:$4|un resultado|$4 resultados}} como máximo.",
+ "perfcachedts": "Los siguientes datos provienen de la caché y su última actualización fue: $1. La caché puede contener {{PLURAL:$4|un resultado|$4 resultados}} como máximo.",
"querypage-no-updates": "Actualmente las actualizaciones de esta página están desactivadas. Estos datos no serán actualizados a corto plazo.",
"viewsource": "Ver código",
"viewsource-title": "Ver el código de «$1»",
"actionthrottledtext": "Como medida contra el ''spam'', la acción que estás realizando está limitada a un número determinado de veces en un periodo corto de tiempo, y has excedido ese límite. Por favor inténtalo de nuevo en unos minutos.",
"protectedpagetext": "Esta página ha sido protegida para evitar su edición u otras acciones.",
"viewsourcetext": "Puedes ver y copiar el código fuente de esta página:",
- "viewyourtext": "Puedes ver y copiar el código de '''tus ediciones''' a esta página:",
+ "viewyourtext": "Puedes ver y copiar el código de <strong>tus ediciones</strong> a esta página:",
"protectedinterface": "Esta página proporciona el texto de la interfaz del software en este wiki, y está protegida para prevenir el abuso.\nPara agregar o cambiar las traducciones para todos los wikis, por favor, usa [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
- "editinginterface": "<strong>Aviso:</strong> Estás editando una página usada para proporcionar el texto de la interfaz para el software. \nLos cambios en esta página afectarán la apariencia de la interfaz para los demás usuarios de este wiki. \nPara añadir o cambiar las traducciones utiliza [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
+ "editinginterface": "<strong>Advertencia:</strong> Estás editando una página usada para proporcionar el texto de la interfaz para el software. \nLos cambios en esta página afectarán la apariencia de la interfaz para los demás usuarios de este wiki. \nPara añadir o cambiar las traducciones de todos los wikis utiliza [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
"cascadeprotected": "Esta página ha sido protegida para su edición, porque está incluida en {{PLURAL:$1|la siguiente página|las siguientes páginas}}, que están protegidas con la opción de «cascada»:\n$2",
- "namespaceprotected": "No tienes permiso para editar las páginas del espacio de nombres '''$1'''.",
+ "namespaceprotected": "No tienes permiso para editar las páginas del espacio de nombres <strong>$1</strong>.",
"customcssprotected": "No tienes permiso para editar esta página CSS, porque contiene configuraciones personales de otro usuario.",
"customjsprotected": "No tienes permiso para editar esta página JavaScript, porque contiene configuraciones personales de otro usuario.",
"mycustomcssprotected": "No tienes permiso para editar esta página CSS.",
"myprivateinfoprotected": "No tienes permiso para editar tu información privada.",
"mypreferencesprotected": "No tienes permiso para editar tus preferencias.",
"ns-specialprotected": "No se pueden editar las páginas especiales.",
- "titleprotected": "Esta página ha sido protegida contra creación por [[User:$1|$1]].\nEl motivo dado fue: \"''$2''\".",
+ "titleprotected": "Esta página ha sido protegida contra creación por [[User:$1|$1]].\nEl motivo dado fue \"<em>$2</em>\".",
"filereadonlyerror": "No se puede modificar el archivo \"$1\" porque el repositorio de archivos \"$2\" está en modo de sólo lectura.\nEl administrador que lo ha bloqueado ofrece esta explicación: \"$3\".",
"invalidtitle-knownnamespace": "El título con el espacio de nombres «$2» y el texto «$3» no es válido",
"invalidtitle-unknownnamespace": "El título con el espacio de nombres desconocido (n.º $1) y el texto «$2» no es válido",
"virus-scanfailed": "falló el análisis (código $1)",
"virus-unknownscanner": "antivirus desconocido:",
"logouttext": "<strong>Ha finalizado tu sesión.</strong>\n\nPuede que algunas páginas continúen mostrándose como si la sesión estuviera iniciada hasta que vacíes la memoria caché del navegador.",
- "welcomeuser": "¡Te damos la bienvenida, $1!",
- "welcomecreation-msg": "Se ha creado tu cuenta.\nNo olvides personalizar tus [[Special:Preferences|preferencias de {{SITENAME}}]].",
- "yourname": "Nombre de usuario:",
+ "welcomeuser": "¡Bienvenido, $1!",
+ "welcomecreation-msg": "Se ha creado tu cuenta.\nPuedes cambiar tus [[Special:Preferences|preferencias]] de {{SITENAME}} si lo deseas.",
+ "yourname": "Usuario:",
"userlogin-yourname": "Usuario",
"userlogin-yourname-ph": "Escribe tu nombre de usuario",
"createacct-another-username-ph": "Escribe el nombre de usuario",
"userlogin-remembermypassword": "Mantener mi sesión iniciada",
"userlogin-signwithsecure": "Usar conexión segura",
"yourdomainname": "Tu dominio:",
- "password-change-forbidden": "No puedes cambiar las contraseñas de este wiki.",
- "externaldberror": "Hubo un error de autenticación externa de la base de datos o bien no tienes autorización para actualizar tu cuenta externa.",
+ "password-change-forbidden": "No puedes cambiar las contraseñas en este wiki.",
+ "externaldberror": "Hubo un error de autenticación de la base de datos o bien no tienes autorización para actualizar tu cuenta externa.",
"login": "Iniciar sesión",
"nav-login-createaccount": "Acceder/crear cuenta",
"loginprompt": "Hay que activar las ''cookies'' en el navegador para iniciar sesión en {{SITENAME}}.",
"gotaccountlink": "Acceder",
"userlogin-resetlink": "¿Olvidaste tus datos de acceso?",
"userlogin-resetpassword-link": "¿Has olvidado tu contraseña?",
- "userlogin-helplink2": "Ayuda con el registro",
+ "userlogin-helplink2": "Ayuda con el acceso",
"userlogin-loggedin": "Ya estás conectado como {{GENDER:$1|$1}}.\nUsa el formulario de abajo para iniciar sesión como otro usuario.",
"userlogin-createanother": "Crear otra cuenta",
"createacct-emailrequired": "Dirección de correo electrónico",
"password-name-match": "Tu contraseña debe ser diferente de tu nombre de usuario.",
"password-login-forbidden": "El uso de este nombre de usuario y contraseña han sido prohibidos.",
"mailmypassword": "Restablecer la contraseña",
- "passwordremindertitle": "Recordatorio de contraseña de {{SITENAME}}",
+ "passwordremindertitle": "Nueva contraseña temporal para {{SITENAME}}",
"passwordremindertext": "Alguien (probablemente tú, desde la dirección IP $1) solicitó que te enviáramos una nueva contraseña para tu cuenta en {{SITENAME}} ($4).\nSe ha creado la siguiente contraseña temporal para el usuario «$2»: «$3»\nAhora deberías iniciar sesión y cambiar tu contraseña. Tu contraseña temporal expirará en {{PLURAL:$5|un día|$5 días}}.\n\nSi fue otro quien solicitó este mensaje o has recordado tu contraseña y ya no deseas cambiarla, puedes ignorar este mensaje y seguir usando tu contraseña original.",
"noemail": "No hay una dirección de correo electrónico registrada para «$1».",
"noemailcreate": "Necesitas proveer una dirección de correo electrónico válida",
"noemailprefs": "Especifica una dirección electrónica para habilitar estas características.",
"emailconfirmlink": "Confirmar dirección de correo electrónico",
"invalidemailaddress": "La dirección electrónica no puede ser aceptada, pues parece que tiene un formato no válido.\nPor favor, escribe una dirección en el formato adecuado o deja el campo en blanco.",
- "cannotchangeemail": "Las direcciones de la correo electrónico de las cuentas de usuario no puedes cambiarse en esta wiki.",
- "emaildisabled": "Este sitio no puede enviar mensajes de correo electrónico.",
+ "cannotchangeemail": "Las direcciones de la correo electrónico de las cuentas de usuario no pueden cambiarse en esta wiki.",
+ "emaildisabled": "Este sitio no puede enviar correos electrónicos.",
"accountcreated": "Se ha creado la cuenta",
"accountcreatedtext": "La cuenta de usuario de [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) ha sido creada.",
"createaccount-title": "Creación de cuenta para {{SITENAME}}",
- "createaccount-text": "Alguien creó en {{SITENAME}} ($4) una cuenta asociada a este correo electrónico con el nombre «$2».\nLa contraseña asignada automáticamente es «$3». Por favor entra ahora y cambia tu contraseña.\n\nPuedes ignorar este mensaje si esta cuenta fue creada por error.",
- "login-throttled": "Has intentado demasiadas veces iniciar sesión. Por favor espera $1 antes de intentarlo nuevamente.",
+ "createaccount-text": "Alguien creó en {{SITENAME}} ($4) una cuenta asociada a este correo electrónico con el nombre «$2» y contraseña «$3». Por favor entra ahora y cambia tu contraseña.\n\nPuedes ignorar este mensaje si esta cuenta fue creada por error.",
+ "login-throttled": "Has intentado demasiadas veces iniciar sesión recientemente. Por favor espera $1 antes de intentarlo nuevamente.",
"login-abort-generic": "Tu inicio de sesión no fue exitoso - Cancelado",
"loginlanguagelabel": "Idioma: $1",
"suspicious-userlogout": "Tu solicitud de desconexión ha sido denegada, pues parece haber sido enviada desde un navegador defectuoso o un proxy caché.",
"retypenew": "Confirmar la contraseña nueva:",
"resetpass_submit": "Establecer contraseña e iniciar sesión",
"changepassword-success": "La contraseña se modificó correctamente.",
- "changepassword-throttled": "Has intentado acceder demasiadas veces.\nEspera $1 antes de intentarlo de nuevo.",
+ "changepassword-throttled": "Has intentado acceder demasiadas veces recientemente.\nEspera $1 antes de intentarlo de nuevo.",
"resetpass_forbidden": "No se pueden cambiar las contraseñas",
"resetpass-no-info": "Debes iniciar sesión para acceder directamente a esta página.",
"resetpass-submit-loggedin": "Cambiar contraseña",
"resetpass-submit-cancel": "Cancelar",
- "resetpass-wrong-oldpass": "La contraseña antigua no es correcta.\nPuede que ya hayas cambiado la contraseña o que hayas pedido una temporal.",
+ "resetpass-wrong-oldpass": "La contraseña actual, o temporal, no es correcta.\nPuede que ya hayas cambiado exitosamente tu contraseña o que hayas pedido una nueva contraseña temporal.",
"resetpass-recycled": "Restablece tu contraseña a algo distinto de tu contraseña actual.",
- "resetpass-temp-emailed": "Has iniciado sesión con un código temporal por correo electrónico.\nPara terminar la sesión, debes establecer una nueva contraseña aquí:",
+ "resetpass-temp-emailed": "Has iniciado sesión con un código temporal por correo electrónico.\nPara terminar el acceso, debes establecer una nueva contraseña aquí:",
"resetpass-temp-password": "Contraseña temporal:",
"resetpass-abort-generic": "Una extensión ha cancelado el cambio de la contraseña.",
"resetpass-expired": "Tu contraseña ha caducado. Por favor, establece una nueva contraseña para iniciar sesión.",
- "resetpass-expired-soft": "Su contraseña ha caducado y necesita reajustarse. Elija una nueva contraseña ahora, o haga clic en \"{{int:resetpass-enviar-cancelar}}\" para restaurarla más adelante.",
+ "resetpass-expired-soft": "Tu contraseña ha caducado y necesita restablecerse. Elije una nueva contraseña ahora, o haga clic en \"{{int:resetpass-submit-cancel}}\" para restaurarla más adelante.",
"resetpass-validity-soft": "Tu contraseña no es válida: $1\n\nCámbiala ahora por una nueva, o haz clic en \"{{int:resetpass-submit-cancel}}\" para cambiarla más tarde.",
- "passwordreset": "Restablecimiento de contraseña",
- "passwordreset-text-one": "Completa este formulario para restablecer tu contraseña.",
- "passwordreset-text-many": "{{PLURAL:$1|Rellena uno de los campos para restablecer la contraseña.}}",
+ "passwordreset": "Restablecer contraseña",
+ "passwordreset-text-one": "Completa este formulario para recibir una contraseña temporal por correo electrónico.",
+ "passwordreset-text-many": "{{PLURAL:$1|Rellena uno de los campos para recibir una contraseña temporal por correo electrónico.}}",
"passwordreset-legend": "Restablecer contraseña",
"passwordreset-disabled": "Se ha desactivado el restablecimiento de contraseñas en este wiki.",
"passwordreset-emaildisabled": "Las funciones de correo electrónico han sido desactivadas en esta wiki.",
"passwordreset-email": "Dirección de correo electrónico:",
"passwordreset-emailtitle": "Detalles de la cuenta en {{SITENAME}}",
"passwordreset-emailtext-ip": "Alguien (probablemente tú, desde la dirección IP $1) ha solicitado la renovación de tu clave para {{SITENAME}} ($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}}\ncon esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} caducarán en {{PLURAL:$5|un día|$5 días}}.\nDeberías iniciar sesión y establecer una contraseña nueva ahora. Si otra persona ha realizado este solicitud\no si recuerdas tu contraseña original y no deseas cambiarla, puedes\nignorar este mensaje y continuar usando tu contraseña anterior.",
- "passwordreset-emailtext-user": "El usuario $1 en {{SITENAME}} pidió un recordatorio de tus datos de cuenta para {{SITENAME}}\n($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}} con esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} expirarán en {{PLURAL:$5|un día|$5 días}}.\nDeberías iniciar sesión y establecer una contraseña nueva ahora. Si alguien más hizo este pedido,\no recuerdas tu contraseña original, y no deseas cambiarla, puedes\nignorar este mensaje y continuar usando tu contraseña anterior.",
+ "passwordreset-emailtext-user": "El usuario $1 en {{SITENAME}} pidió un restablecer tu contraseña para {{SITENAME}}\n($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}} con esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} expirarán en {{PLURAL:$5|un día|$5 días}}.\nDeberías iniciar sesión y establecer una contraseña nueva ahora. Si alguien más hizo este pedido,\no recuerdas tu contraseña original, y no deseas cambiarla, puedes\nignorar este mensaje y continuar usando tu contraseña anterior.",
"passwordreset-emailelement": "Nombre de usuario: $1\nContraseña temporal: $2",
"passwordreset-emailsent": "Se ha enviado un correo electrónico para el restablecimiento de tu contraseña.",
"passwordreset-emailsent-capture": "Se ha enviado un correo para el restablecimiento de la contraseña, el cual se muestra a continuación.",
- "passwordreset-emailerror-capture": "Se generó un correo electrónico de restablecimiento de contraseña, que se muestra a continuación, pero el envío {{GENDER:$2|al usuario|a la usuaria}} falló. $1",
+ "passwordreset-emailerror-capture": "Se generó un correo electrónico de restablecimiento de contraseña, que se muestra a continuación, pero el envío {{GENDER:$2|al usuario|a la usuaria}} falló: $1",
"changeemail": "Cambiar la dirección de correo electrónico",
"changeemail-header": "Cambiar la dirección de correo de la cuenta",
"changeemail-text": "Rellena este formulario para cambiar tu dirección de correo electrónico. Debes introducir la contraseña para confirmar este cambio.",
"preview": "Previsualizar",
"showpreview": "Mostrar previsualización",
"showdiff": "Mostrar los cambios",
- "anoneditwarning": "'''Aviso:''' No has iniciado sesión con una cuenta de usuario.\nTu dirección IP se almacenará en el historial de ediciones de la página.",
- "anonpreviewwarning": "''No has iniciado sesión con una cuenta de usuario. Al guardar los cambios se almacenará tu dirección IP en el historial de edición de la página.''",
- "missingsummary": "'''Atención:''' No has escrito un resumen de edición. Si haces clic nuevamente en «{{int:savearticle}}» tu edición se grabará sin él.",
+ "anoneditwarning": "<strong>Advertencia:</strong> No has iniciado sesión.\nTu dirección IP se almacenará en el historial de edición de esta página.",
+ "anonpreviewwarning": "<em>No has iniciado sesión. Al guardar los cambios se almacenará tu dirección IP en el historial de edición de esta página.</em>",
+ "missingsummary": "<strong>Recordatorio:</strong> No has escrito un resumen de edición.\nSi haces clic nuevamente en «{{int:savearticle}}» tu edición se grabará sin él.",
"missingcommenttext": "Escribe un comentario a continuación.",
- "missingcommentheader": "'''Recordatorio:''' No has escrito un título para este comentario. Si haces clic nuevamente en \"{{int:savearticle}}\" tu edición se grabará sin él.",
+ "missingcommentheader": "<strong>Recordatorio:</strong> No has escrito un asunto/encabezado para este comentario.\nSi haces clic nuevamente en \"{{int:savearticle}}\" tu edición se grabará sin él.",
"summary-preview": "Previsualización del resumen:",
- "subject-preview": "Previsualización del tema/título:",
+ "subject-preview": "Previsualización del asunto/encabezado:",
"blockedtitle": "El usuario está bloqueado",
- "blockedtext": "'''Tu nombre de usuario o dirección IP ha sido bloqueada.'''\n\nEl bloqueo fue hecho por $1.\nLa razón dada es ''$2''.\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar con $1 u otro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir el bloqueo.\nNo puedes utilizar la función «enviar correo electrónico a este usuario» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y que el bloqueo no haya inhabilitado esta función.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es #$5.\nPor favor incluye todos los datos aquí mostrados en cualquier consulta que hagas.",
- "autoblockedtext": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por otro usuario que fue bloqueado por $1.\nLa razón dada es esta:\n\n:''$2''\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar con $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\n\nTen en cuenta que no podrás utilizar la herramienta de «enviar correo electrónico a este usuario» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y que el bloqueo no haya inhabilitado esta función.\n\nTu actual dirección IP es $3, y el identificador del bloqueo es #$5.\nPor favor, incluye todos los datos mostrados aquí en cualquier consulta que hagas.",
+ "blockedtext": "<strong>Tu nombre de usuario o dirección IP ha sido bloqueada.</strong>\n\nEl bloqueo fue hecho por $1.\nLa razón dada es <em>$2</em>.\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar a $1 u otro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir el bloqueo.\nNo puedes utilizar la función «enviar correo electrónico a este usuario» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y que el bloqueo no haya inhabilitado esta función.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es #$5.\nPor favor incluye todos los datos aquí mostrados en cualquier consulta que hagas.",
+ "autoblockedtext": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por otro usuario que fue bloqueado por $1.\nLa razón dada es esta:\n\n:<em>$2</em>\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar con $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\n\nTen en cuenta que no podrás utilizar la herramienta de «enviar correo electrónico a este usuario» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y que el bloqueo no haya inhabilitado esta función.\n\nTu actual dirección IP es $3, y el identificador del bloqueo es #$5.\nPor favor, incluye todos los datos mostrados aquí en cualquier consulta que hagas.",
"blockednoreason": "no se ha especificado el motivo",
"whitelistedittext": "Tienes que $1 para editar artículos.",
"confirmedittext": "Debes confirmar tu dirección electrónica antes de editar páginas. Por favor, establece y valida una dirección electrónica a través de tus [[Special:Preferences|preferencias de usuario]].",
"loginreqlink": "acceder",
"loginreqpagetext": "Debes $1 para ver otras páginas.",
"accmailtitle": "Se ha enviado la contraseña",
- "accmailtext": "Se ha enviado a $2 una contraseña generada aleatoriamente para [[User talk:$1|$1]].\n\nLa contraseña para esta nueva cuenta puede cambiarse en [[Special:ChangePassword|la página destinada para ello]] después de haber iniciado sesión.",
+ "accmailtext": "Se ha enviado a $2 una contraseña generada aleatoriamente para [[User talk:$1|$1]]. Puede cambiarse en la página [[Special:ChangePassword|destinada para ello]] después de haber iniciado sesión.",
"newarticle": "(Nuevo)",
"newarticletext": "Has seguido un enlace a una página que aún no existe.\nPara crear esta página, escribe en el campo a continuación. Para más información, consulta la [$1 página de ayuda].\nSi llegaste aquí por error, vuelve a la página anterior.",
"anontalkpagetext": "---- ''Esta es la página de discusión de un usuario anónimo que aún no ha creado una cuenta, o no la usa. Por lo tanto, tenemos que usar su dirección IP para identificarlo. Una dirección IP puede ser compartida por varios usuarios. Si eres un usuario anónimo y crees que se han dirigido a ti con comentarios improcedentes, por favor [[Special:UserLogin/signup|crea una cuenta]] o si ya la tienes [[Special:UserLogin|identifícate]] para evitar confusiones futuras con otros usuarios anónimos.''",
"difference-missing-revision": "No {{PLURAL:$2|se ha encontrado|se han encontrado}} {{PLURAL:$2|una revisión|$2 revisiones}} de esta diferencia ($1).\n\nEsto suele deberse a seguir un enlace obsoleto hacia una página que ya ha sido borrada.\nLos detalles pueden encontrarse en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrado].",
"searchresults": "Resultados de la búsqueda",
"searchresults-title": "Resultados de la búsqueda de «$1»",
- "toomanymatches": "Se han obtenido muchos resultados; por favor intenta una consulta diferente",
"titlematches": "Coincidencias de título de artículo",
"textmatches": "Coincidencias de texto de artículo",
"notextmatches": "No hay coincidencias de texto de artículo",
"largefileserver": "El tamaño de este archivo es mayor del que este servidor admite por configuración.",
"emptyfile": "El archivo que has intentado subir parece estar vacío; por favor, verifica que realmente se trate del archivo que intentabas subir.",
"windows-nonascii-filename": "Este wiki no admite nombres de archivo con caracteres especiales.",
- "fileexists": "Ya existe un archivo con este nombre, por favor comprueba <strong>[[:$1]]</strong> si no estás seguro de querer cambiarlo.\n[[$1|thumb]]",
+ "fileexists": "Ya existe un archivo con este nombre, por favor comprueba <strong>[[:$1]]</strong> si {{GENDER:|tú}} no estás seguro de querer cambiarlo.\n[[$1|thumb]]",
"filepageexists": "La página de descripción de este archivo ya ha sido creada en <strong>[[:$1]]</strong>, pero no existe actualmente ningún fichero con este nombre.\nEl resumen que ha ingresado no aparecerá en la página de descripción. Para que el sumario aparezca, deberá editarlo manualmente.\n[[$1|thumb]]",
"fileexists-extension": "Existe un archivo con un nombre similar: [[$2|thumb]]\n* Nombre del archivo que se está subiendo: <strong>[[:$1]]</strong>\n* Nombre del archivo ya existente: <strong>[[:$2]]</strong>\nPor favor, elige un nombre diferente.",
"fileexists-thumbnail-yes": "El archivo parece ser una imagen de tamaño reducido ''(thumbnail)''. [[$1|thumb]]\nPor favor comprueba el archivo <strong>[[:$1]]</strong>.\nSi el archivo comprobado es la misma imagen a tamaño original no es necesario subir un thumbnail más.",
"tooltip-summary": "Introduce un breve resumen",
"interlanguage-link-title": "$1 ($2)",
"common.css": "/* El CSS colocado en esta página será aplicado a todas las apariencias */",
- "monobook.css": "/* El CSS colocado en esta página afectará a los usuarios que usen la apariencia \"MonoBook\" */",
- "vector.css": "/* El CSS colocado en esta página afectará a los usuarios que usen la apariencia \"Vector\" */",
"print.css": "/* Los estilos CSS colocados aquí afectarán la impresión */",
"noscript.css": "/* Los estilos CSS colocados aquí se aplicarán a los usuarios que hayan desactivado el JavaScript en su navegador */",
"group-autoconfirmed.css": "/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Usuarios autoconfirmados */",
"group-sysop.css": "/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Administradores */",
"group-bureaucrat.css": "/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Burócratas */",
"common.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada carga de página */",
- "monobook.js": "/* El código JavaScript que se ponga aquí será cargado por los usuarios de la apariencia MonoBook */",
- "vector.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la apariencia Vector */",
"group-autoconfirmed.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Usuarios autoconfirmados */",
"group-bot.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Bots */",
"group-sysop.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Administradores */",
"pageinfo-category-pages": "Número de páginas",
"pageinfo-category-subcats": "Número de subcategorías",
"pageinfo-category-files": "Número de archivos",
- "skinname-monobook": "MonoBook",
- "skinname-vector": "Vector",
"markaspatrolleddiff": "Marcar como revisado",
"markaspatrolledtext": "Marcar este artículo como revisado",
"markedaspatrolled": "Marcado como revisado",
"qbmyoptions": "Minu leheküljed",
"faq": "KKK",
"faqpage": "Project:KKK",
- "vector-action-addsection": "Lisa teema",
- "vector-action-delete": "Kustuta",
- "vector-action-move": "Teisalda",
- "vector-action-protect": "Kaitse",
- "vector-action-undelete": "Taasta",
- "vector-action-unprotect": "Muuda kaitset",
- "vector-view-create": "Loo",
- "vector-view-edit": "Muuda",
- "vector-view-history": "Näita ajalugu",
- "vector-view-view": "Vaata",
- "vector-view-viewsource": "Vaata lähteteksti",
"actions": "Toimingud",
- "vector-more-actions": "Veel",
"namespaces": "Nimeruumid",
"variants": "Variandid",
"navigation-heading": "Navigeerimismenüü",
"noname": "Sa ei sisestanud kasutajanime lubataval kujul.",
"loginsuccesstitle": "Sisselogimine õnnestus",
"loginsuccess": "Oled sisse loginud. Sinu kasutajanimi on \"$1\".",
- "nosuchuser": "Kasutajat \"$1\" ei ole olemas.\nKasutajanimed on tõstutundlikud.\nKontrollige kirjapilti või [[Special:UserLogin/signup|looge uus kasutajakonto]].",
- "nosuchusershort": "Kasutajat nimega \"$1\" ei ole olemas. Kontrollige kirjapilti.",
+ "nosuchuser": "Kasutajat \"$1\" pole.\nKasutajanimed on tõstutundlikud.\nKontrolli kirjapilti või [[Special:UserLogin/signup|loo uus konto]].",
+ "nosuchusershort": "Kasutajat nimega \"$1\" pole.\nKontrolli kirjapilti.",
"nouserspecified": "Kasutajanimi puudub.",
"login-userblocked": "See kasutaja on blokeeritud. Sisselogimine pole lubatud.",
"wrongpassword": "Vale parool. Proovi uuesti.",
"templatesusedpreview": "Eelvaates {{PLURAL:$1|kasutatav mall|kasutatavad mallid}}:",
"templatesusedsection": "Selles alaosas {{PLURAL:$1|kasutatav mall|kasutatavad mallid}}:",
"template-protected": "(kaitstud)",
- "template-semiprotected": "(osaliselt kaitstud)",
+ "template-semiprotected": "(poolkaitstud)",
"hiddencategories": "See lehekülg kuulub {{PLURAL:$1|1 peidetud kategooriasse|$1 peidetud kategooriasse}}:",
"nocreatetext": "Lehekülje loomise õigus on {{GRAMMAR:inessive|{{SITENAME}}}} piiratud.\nVõid pöörduda tagasi ja toimetada olemasolevat lehekülge või [[Special:UserLogin|sisse logida või uue konto luua]].",
"nocreate-loggedin": "Sul ei ole luba luua uusi lehekülgi.",
"mergehistory-empty": "Ühtegi redaktsiooni ei saa liita.",
"mergehistory-success": "Lehekülje [[:$1]] {{PLURAL:$3|üks redaktsioon|$3 redaktsiooni}} liideti lehega [[:$2]].",
"mergehistory-fail": "Muudatuste ajaloo liitmine ebaõnnestus. Palun kontrolli lehekülje ja aja parameetreid.",
+ "mergehistory-fail-toobig": "Ajalugusid ei õnnestu liita, sest teisaldada tuleks rohkem kui {{PLURAL:$1|üks redaktsioon|$1 redaktsiooni}}, mis on piirmäär.",
"mergehistory-no-source": "Alliklehekülge $1 pole olemas.",
"mergehistory-no-destination": "Sihtlehekülge $1 pole olemas.",
"mergehistory-invalid-source": "Allikleheküljel peab olema lubatav pealkiri.",
"difference-missing-revision": "Selle erinevuste vaate {{PLURAL:$2|üht|$2}} redaktsiooni ($1) ei leitud.\n\nHarilikult tähendab see seda, et sind siia juhatanud link on vananenud ja siin asunud lehekülg on kustutatud.\nÜksikasjad leiad [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} kustutamislogist].",
"searchresults": "Otsingu tulemused",
"searchresults-title": "Otsingu \"$1\" tulemused",
- "toomanymatches": "Liiga palju tulemusi, ürita teistsugust päringut",
"titlematches": "Vasted lehekülje pealkirjades",
"textmatches": "Vasted lehekülje tekstides",
"notextmatches": "Vasted lehekülje tekstides puuduvad.",
"right-sendemail": "Saata teistele kasutajatele e-kirju",
"right-passwordreset": "Vaadata parooli lähtestamise e-kirju",
"newuserlogpage": "Kasutaja loomise logi",
- "newuserlogpagetext": "See logi sisaldab infot äsja loodud uute kasutajate kohta.",
+ "newuserlogpagetext": "Siin on logitud kasutajate registreerimine.",
"rightslog": "Kasutajaõiguste logi",
"rightslogtext": "See on logi kasutajate õiguste muutuste kohta.",
"action-read": "seda lehekülge lugeda",
"windows-nonascii-filename": "Sellel vikil puudub erimärkidega failinimede tugi.",
"fileexists": "Sellise nimega fail on juba olemas. Palun vaata lehekülge <strong>[[:$1]]</strong>, kui sa pole kindel, kas soovid seda muuta.\n[[$1|thumb]]",
"filepageexists": "Selle faili kirjelduslehekülg <strong>[[:$1]]</strong> on juba loodud, aga selle nimega faili hetkel pole.\nSinu sisestatud kokkuvõtet ei kuvata kirjeldusleheküljel.\nSinu kokkuvõtte kuvamiseks tuleb kirjelduslehekülge eraldi redigeerida.\n[[$1|thumb]]",
- "fileexists-extension": "Sarnase nimega fail on olemas: [[$2|thumb]]\n* Üleslaetava faili nimi: <strong>[[:$1]]</strong>\n* Olemasoleva faili nimi: <strong>[[:$2]]</strong>\nPalun vali teistsugune nimi.",
+ "fileexists-extension": "Sarnase nimega fail on olemas: [[$2|thumb]]\n* Üleslaaditava faili nimi: <strong>[[:$1]]</strong>\n* Olemasoleva faili nimi: <strong>[[:$2]]</strong>\nKas tahaksid ehk kasutada paremini eristavat nime?",
"fileexists-thumbnail-yes": "See paistab olevat vähendatud suurusega pilt (''pisipilt''). [[$1|thumb]]\nPalun vaata faili <strong>[[:$1]]</strong>.\nKui vaadatud fail on sama pilt algupärases suuruses, pole vaja täiendavat pisipilti üles laadida.",
"file-thumbnail-no": "Failinimi algab eesliitega <strong>$1</strong>.\nSee paistab vähendatud suurusega pilt (''pisipilt'') olevat.\nKui sul on ka selle pildi täislahutusega versioon, laadi palun hoopis see üles, vastasel korral muuda palun faili nime.",
"fileexists-forbidden": "Sellise nimega fail on juba olemas, seda ei saa üle kirjutada.\nPalun pöörduge tagasi ja laadige fail üles mõne teise nime all. [[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "Failide kustutamine ja taastamine on hoolduse ajaks keelatud.",
"filedelete-maintenance-title": "Faili ei saa kustutada",
"mimesearch": "MIME otsing",
- "mimesearch-summary": "Selle leheküljega saab faile otsida MIME tüübi järgi.\nSisesta kujul tüüp/alamtüüp, näiteks <code>image/jpeg</code>.",
+ "mimesearch-summary": "Selle leheküljega saab faile otsida MIME tüübi järgi.\nSisesta kujul sisutüüp/alamtüüp või sisutüüp/*, näiteks <code>image/jpeg</code>.",
"mimetype": "MIME tüüp:",
"download": "laadi alla",
"unwatchedpages": "Jälgimata lehed",
"listduplicatedfiles-summary": "Siin on loetletud failid, mille viimane versioon on mõne teise faili viimase versiooni duplikaat. Arvesse võetakse ainult kohalikke faile.",
"listduplicatedfiles-entry": "Failil [[:File:$1|$1]] on [[$3|{{PLURAL:$2|üks duplikaat|$2 duplikaati}}]].",
"unusedtemplates": "Kasutamata mallid",
- "unusedtemplatestext": "See lehekülg loetleb kõik leheküljed nimeruumis {{ns:template}}, mida teistel lehekülgedel ei kasutata. Enne kustutamist palun kontrollige, kas siia pole muid linke.",
+ "unusedtemplatestext": "See lehekülg loetleb kõik leheküljed nimeruumis {{ns:template}}, mida teistel lehekülgedel ei kasutata.\nEnne kustutamist kontrolli ka muid malli juurde viitavaid linke.",
"unusedtemplateswlh": "teised lingid",
"randompage": "Juhuslik artikkel",
"randompage-nopages": "{{PLURAL:$2|Järgmises nimeruumis|Järgmistes nimeruumides}} ei ole ühtegi lehekülge: $1.",
"pageinfo-category-pages": "Lehekülgede arv",
"pageinfo-category-subcats": "Alamkategooriate arv",
"pageinfo-category-files": "Failide arv",
- "skinname-monobook": "MonoBook",
- "skinname-vector": "Vektor",
"markaspatrolleddiff": "Märgi kontrollituks",
"markaspatrolledtext": "Märgi see leht kontrollituks",
"markedaspatrolled": "Kontrollituks märgitud",
"version-hook-name": "Haagi nimi",
"version-hook-subscribedby": "Tellijad",
"version-version": "($1)",
+ "version-no-ext-name": "[nimi puudub]",
"version-license": "MediaWiki litsents",
"version-ext-license": "Litsents",
"version-ext-colheader-name": "Lisa",
"qbmyoptions": "Nire orrialdeak",
"faq": "Maiz egindako galderak",
"faqpage": "Project:Maiz egindako galderak",
- "vector-action-addsection": "Gehitu atala",
- "vector-action-delete": "Ezabatu",
- "vector-action-move": "Mugitu",
- "vector-action-protect": "Babestu",
- "vector-action-undelete": "Berreskuratu",
- "vector-action-unprotect": "Babesa aldatu",
- "vector-view-create": "Sortu",
- "vector-view-edit": "Aldatu",
- "vector-view-history": "Ikusi historia",
- "vector-view-view": "Irakurri",
- "vector-view-viewsource": "Kodea ikusia",
"actions": "Ekintzak",
"namespaces": "Izen-tarteak",
"variants": "Aldaerak",
"diff-empty": "(Ez dago alderik)",
"searchresults": "Bilaketaren emaitzak",
"searchresults-title": "\"$1(e)rako\" emaitzak bilatu",
- "toomanymatches": "Aukera gehiegi aurkitu dira, saia zaitez beste eskaera ezberdin batekin",
"titlematches": "Emaitzak artikuluen izenburuetan",
"textmatches": "Emaitza orrialde testuetan",
"notextmatches": "Ez dago bat datorren orrialde testurik",
"tooltip-preferences-save": "Hobespenak gorde",
"tooltip-summary": "Laburpen labur bat sar ezazu",
"common.css": "/** Hemen idatzitako CSS kodeak itxura guztietan izango du eragina */",
- "monobook.css": "/* Hemen idatzitako CSS kodeak Monobook itxuran bakarrik izango du eragina */",
"common.js": "/* Hemen idatzitako JavaScript kode oro erabiltzaile guztiek edozein orrialde irekitzerakoan kargatuko da. */",
"anonymous": "{{SITENAME}}(e)ko lankide {{PLURAL:$1|anonimoa|anonimoak}}",
"siteuser": "{{SITENAME}}(e)ko $1 erabiltzailea",
"qbmyoptions": "صفحههای من",
"faq": "پرسشهای متداول",
"faqpage": "Project:پرسشهای متداول",
- "vector-action-addsection": "افزودن بخش",
- "vector-action-delete": "حذف",
- "vector-action-move": "انتقال",
- "vector-action-protect": "محافظت",
- "vector-action-undelete": "احیا",
- "vector-action-unprotect": "تغییر سطح حفاظت",
- "vector-view-create": "ایجاد",
- "vector-view-edit": "ویرایش",
- "vector-view-history": "نمایش تاریخچه",
- "vector-view-view": "خواندن",
- "vector-view-viewsource": "نمایش مبدأ",
"actions": "عملکردها",
- "vector-more-actions": "بیشتر",
"namespaces": "فضاهای نام",
"variants": "گویشها",
"navigation-heading": "منوی ناوبری",
"mergehistory-empty": "هیچیک از نسخهها قابل ادغام نیستند.",
"mergehistory-success": "$3 نسخه از [[:$1]] با موفقیت در [[:$2]] ادغام {{PLURAL:$3|شد|شدند}}.",
"mergehistory-fail": "ادغام تاریخچه ممکن نیست، لطفاً گزینههای صفحه و زمان را بازبینی کنید.",
+ "mergehistory-fail-toobig": "نمیتوان ادغام تاریخچه را انجام داد که بیشتر از محدودیت $1 {{PLURAL:$1|نسخه}} انتقال داده خواهد شد.",
"mergehistory-no-source": "صفحهٔ مبدأ $1 وجود ندارد.",
"mergehistory-no-destination": "صفحهٔ مقصد $1 وجود ندارد.",
"mergehistory-invalid-source": "صفحهٔ مبدأ باید عنوانی معتبر داشته باشد.",
"difference-missing-revision": "{{PLURAL:$2|یک ویرایش|$2 ویرایش}} از تفاوت نسخهها ($1) {{PLURAL:$2|یافت|یافت}} نشد.\n\nمعمولاً در اثر پیوند به تاریخچهٔ بهروز نشدهٔ صفحهٔ حذف شده است.\nمیتوانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.",
"searchresults": "نتایج جستجو",
"searchresults-title": "نتایج جستجو برای «$1»",
- "toomanymatches": "تعداد موارد مطابق خیلی زیاد بود، لطفاً درخواست دیگری را امتحان کنید",
"titlematches": "تطبیق عنوان مقاله",
"textmatches": "تطبیق متن مقاله",
"notextmatches": "متن هیچ مقالهای مطابقت ندارد",
"largefileserver": "این پرونده از اندازهای که سرور پیکربندی شده تا بپذیرد بزرگتر است.",
"emptyfile": "پروندهٔ بارگذاریشده خالی به نظر میرسد.\nاین مشکل ممکن است به علت خطای تایپی در نام پرونده باشد.\nلطفاً تأیید کنید که میخواهید این پرونده را با همین شرایط بارگذاری کنید.",
"windows-nonascii-filename": "این ویکی از نام پرونده با نویسههای خاص پشتیبانی نمیکند.",
- "fileexists": "پروندهای با همین نام از قبل موجود است، اگر مطمئن نیستید که میخواهید آن پرونده را تغییر دهید، لطفاً <strong>[[:$1]]</strong> را بررسی کنید.\n[[$1|thumb]]",
+ "fileexists": "پروندهای با همین نام از قبل موجود است، اگر مطمئن {{GENDER:|نیستید}} که میخواهید آن پرونده را تغییر دهید، لطفاً <strong>[[:$1]]</strong> را بررسی کنید.\n[[$1|thumb]]",
"filepageexists": "صفحهٔ توضیح برای این پرونده از قبل در <strong>[[:$1]]</strong> ایجاد شدهاست، اما پروندهای با این نام وجود ندارد.\nخلاصهای که وارد میکنید در صفحهٔ توضیح نمایش نخواهد یافت.\nبرای آن که خلاصه شما نمایش یابد، باید آن را به صورت دستی ویرایش کنید.\n[[$1|thumb]]",
- "fileexists-extension": "پروندهای با نام مشابه وجود دارد: [[$2|thumb]]\n* نام پروندهای که بارگذاری کردید این بود:<strong>[[:$1]]</strong>\n* نام پروندهای که از قبل موجود است این است:<strong>[[:$2]]</strong>\nلطفاً یک نام دیگر انتخاب کنید.",
+ "fileexists-extension": "پروندهای با نام مشابه وجود دارد: [[$2|thumb]]\n* نام پروندهای که بارگذاری میکردید: <strong>[[:$1]]</strong>\n* نام پروندهای که از قبل موجود بود: <strong>[[:$2]]</strong>\nمیخواهید بیش از یک نام متمایز استفاده کنید؟",
"fileexists-thumbnail-yes": "به نظر میرسد که این پرونده، یک تصویر کوچک شده (''بندانگشتی'' یا ''thumbnail'') باشد.\n[[$1|thumb]]\nلطفاً پروندهٔ <strong>[[:$1]]</strong> را بررسی کنید.\nاگر پروندهای که بررسی کردید، همین تصویر در اندازهٔ اصلیاش است، نیازی به بارگذاری یک نسخهٔ بندانگشتی اضافه نیست.",
"file-thumbnail-no": "نام پرونده با <strong>$1</strong> آغاز میشود.\nبه نظر میرسد که این پرونده، یک تصویر ''بندانگشتی'' ''(thumbnail)'' از تصویر بزرگتر اصلی باشد.\nاگر تصویر با اندازهٔ اصلی را دارید، آن را بارگذاری کنید؛ در غیر این صورت، نام پرونده را تغییر دهید.",
"fileexists-forbidden": "در حال حاضر، پروندهای به همین نام وجود دارد، و قابل رونویسی نیست.\nاگر همچنان میخواهید که پروندهٔ خود را بارگذاری کنید، لطفاً برگردید و نام دیگری استفاده کنید.\n[[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "حذف و احیای پروندهها در مدت نگهداری به طور موقت غیرفعال است.",
"filedelete-maintenance-title": "نمیتواند پرونده را حذف کند",
"mimesearch": "جستجوی بر اساس MIME",
- "mimesearch-summary": "با کمک این صفحه شما میتوانید پروندههایی که یک نوع MIME به خصوص دارند را پیدا کنید.\nورودی: به صورت contenttype/subtype ، نظیر <code>image/jpeg</code>.",
+ "mimesearch-summary": "با کمک این صفحه شما میتوانید پروندههایی که یک نوع MIME به خصوص دارند را پیدا کنید.\nورودی: به صورت contenttype/subtype یا contenttype/*‎، نظیر <code>image/jpeg</code>.",
"mimetype": "نوع MIME:",
"download": "دریافت",
"unwatchedpages": "صفحههای پیگیرینشده",
"wantedtemplates": "الگوهای مورد نیاز",
"mostlinked": "صفحههایی که بیشتر از همه به آنها پیوند داده شدهاست",
"mostlinkedcategories": "ردههایی که بیشتر از همه به آنها پیوند داده شدهاست",
- "mostlinkedtemplates": "اÙ\84Ú¯Ù\88Ù\87اÛ\8cÛ\8c Ú©Ù\87 بÛ\8cشتر از Ù\87Ù\85Ù\87 بÙ\87 Ø¢Ù\86â\80\8cÙ\87ا Ù¾Û\8cÙ\88Ù\86د دادÙ\87 شدÙ\87â\80\8cاست",
+ "mostlinkedtemplates": "ببشترÛ\8cÙ\86 صÙ\81ØÙ\87â\80\8cÙ\87اÛ\8c تراگÙ\86جاÛ\8cØ´â\80\8cشدÙ\87",
"mostcategories": "صفحههای دارای بیشترین رده",
"mostimages": "پروندههایی که بیشتر از همه به آنها پیوند داده شدهاست",
"mostinterwikis": "صفحههای دارای بیشترین میانویکی",
"tooltip-preferences-save": "ذخیره کردن ترجیحات",
"tooltip-summary": "خلاصهای وارد کنید",
"interlanguage-link-title": "$1–$2",
+ "interlanguage-link-title-nonlang": "$1 – $2",
"common.css": "/* دستورات این بخش همهٔ کاربران را تحت تاثیر قرار میدهند. */",
- "monobook.css": "/* دستورات این بخش کاربرانی را که از پوستهٔ مونوبوک استفاده کنند تحت تاثیر قرار میدهند. */",
"anonymous": "{{PLURAL:$1|کاربر|کاربران}} گمنام {{SITENAME}}",
"siteuser": "$1، کاربر {{SITENAME}}",
"anonuser": "$1 کاربر ناشناس {{SITENAME}}",
"pageinfo-category-pages": "تعداد صفحهها",
"pageinfo-category-subcats": "تعداد زیرردهها",
"pageinfo-category-files": "تعداد پروندهها",
- "skinname-monobook": "مونوبوک",
- "skinname-vector": "برداری",
"markaspatrolleddiff": "برچسب گشت بزن",
"markaspatrolledtext": "به این صفحه برچسب گشت بزن",
"markedaspatrolled": "برچسب گشت زده شد",
"qbmyoptions": "Omat sivut",
"faq": "Usein kysytyt kysymykset",
"faqpage": "Project:Usein kysytyt kysymykset",
- "vector-action-addsection": "Lisää aihe",
- "vector-action-delete": "Poista",
- "vector-action-move": "Siirrä",
- "vector-action-protect": "Suojaa",
- "vector-action-undelete": "Palauta",
- "vector-action-unprotect": "Muuta suojausta",
- "vector-view-create": "Luo",
- "vector-view-edit": "Muokkaa",
- "vector-view-history": "Näytä historia",
- "vector-view-view": "Lue",
- "vector-view-viewsource": "Näytä lähdekoodi",
"actions": "Toiminnot",
- "vector-more-actions": "Muut",
"namespaces": "Nimiavaruudet",
"variants": "Kirjoitusjärjestelmät",
"navigation-heading": "Navigointivalikko",
"difference-missing-revision": "{{PLURAL:$2|Yhtä versiota|$2 versiota}} tästä vertailusta ($1) {{PLURAL:$2|ei}} löytynyt.\n\nUseimmiten tämä johtuu vanhentuneesta vertailulinkistä poistettuun sivuun.\nLisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].",
"searchresults": "Hakutulokset",
"searchresults-title": "Haun tulokset hakusanalle ”$1”",
- "toomanymatches": "Liian monta osumaa. Kokeile erilaista kyselyä.",
"titlematches": "Osumat sivujen otsikoissa",
"textmatches": "Osumat sivujen teksteissä",
"notextmatches": "Hakusanaa ei löytynyt sivujen teksteistä",
"tooltip-preferences-save": "Tallenna asetukset",
"tooltip-summary": "Kirjoita lyhyt yhteenveto",
"interlanguage-link-title": "$1 — $2",
+ "interlanguage-link-title-nonlang": "$1 – $2",
"common.css": "/* Tämä sivu sisältää koko sivustoa muuttavia tyylejä. */",
- "monobook.css": "/* Tämä sivu sisältää Monobook-ulkoasua muuttavia tyylejä. */",
- "vector.css": "/* Tämä sivu sisältää Vector-ulkoasua muuttavia tyylejä. */",
"print.css": "/* Tämä sivu sisältää tulostettua sivua muuttavia tyylejä */",
"noscript.css": "/* Tämä sivun tyylit muuttavat niiden käyttäjien tyylejä, joilla JavaScript ei ole käytössä */",
"group-autoconfirmed.css": "/* Tämä sivun tyylit muuttavat automaattisesti hyväksyttyjen käyttäjien tyylejä */",
"group-sysop.css": "/* Tämä sivun tyylit muuttavat ylläpitäjien tyylejä */",
"group-bureaucrat.css": "/* Tämä sivun tyylit muuttavat byrokraattien tyylejä */",
"common.js": "/* Tämän sivun JavaScript-koodi liitetään jokaiseen sivulataukseen */",
- "monobook.js": "/* Tämän sivun JavaScript-koodi liitetään Monobook-tyyliin */",
- "vector.js": "/* Tämän sivun JavaScript-koodi liitetään Vector-tyyliin */",
"group-autoconfirmed.js": "/* Tämän sivun JavaScript-koodi liitetään vain automaattisesti hyväksytyille käyttäjille */",
"group-bot.js": "/* Tämän sivun JavaScript-koodi liitetään vain boteille */",
"group-sysop.js": "/* Tämän sivun JavaScript-koodi liitetään vain ylläpitäjille */",
"pageinfo-category-pages": "Sivujen määrä",
"pageinfo-category-subcats": "Alaluokkien määrä",
"pageinfo-category-files": "Tiedostojen määrä",
- "skinname-monobook": "Monobook",
"markaspatrolleddiff": "Merkitse tarkastetuksi",
"markaspatrolledtext": "Merkitse muutos tarkastetuksi",
"markedaspatrolled": "Muutos on tarkastettu",
"qbmyoptions": "Mínar síður",
"faq": "OSS",
"faqpage": "Project:OSS",
- "vector-action-addsection": "Nýtt evni",
- "vector-action-delete": "Strika",
- "vector-action-move": "Flyt",
- "vector-action-protect": "Friða",
- "vector-action-undelete": "Endurstovna",
- "vector-action-unprotect": "Broyt verju",
- "vector-view-create": "Stovna",
- "vector-view-edit": "Rætta",
- "vector-view-history": "Vís søgu",
- "vector-view-view": "Les",
- "vector-view-viewsource": "Vís keldu",
"actions": "Gerningar",
"namespaces": "Navnarúm",
"variants": "Ymisk sløg",
"permalink": "Støðug slóð",
"print": "Prenta",
"view": "Vís",
+ "view-foreign": "Vís á $1",
"edit": "Rætta",
+ "edit-local": "Rætta lokala frágreiðing",
"create": "Stovna",
+ "create-local": "Skriva lokala frágreiðing",
"editthispage": "Rætta hesa síðuna",
"create-this-page": "Stovna hesa síðuna",
"delete": "Strika",
"loginlanguagelabel": "Mál: $1",
"suspicious-userlogout": "Tín fyrispurningur um at útrita var noktaður, tí tað sær út til at hann varð sendur frá einum oyðiløgdum kaga ella caching proxy.",
"createacct-another-realname-tip": "Veruligt navn er valfrítt.\nUm tú velur at skriva tað, so verður tað nýtt til at geva brúkaranum æruna fyri hennara/hansara arbeiði.",
+ "pt-login": "Rita inn",
+ "pt-login-button": "Rita inn",
+ "pt-createaccount": "Stovna kontu",
+ "pt-userlogout": "Rita út",
"php-mail-error-unknown": "Ókend villa í PHP'sa teldupost () funktión.",
"user-mail-no-addy": "Royndi at senda t-post uttan eina t-post adressu.",
"user-mail-no-body": "Tú royndi at senda ein teldupost við ongum ella órímiliga stuttum innihaldi.",
"changepassword": "Broyt loyniorð",
- "resetpass_announce": "Tú ritaði inn við einum fyribils loyniorði, sum tú hevur fingið við telduposti.\nFyri at gera innritanina lidna, mást tú velja tær eitt nýtt loyniorð her:",
+ "resetpass_announce": "Fyri at gera innritanina lidna, mást tú velja tær eitt nýtt loyniorð.",
"resetpass_header": "Broyt loyniorði á kontuni",
"oldpassword": "Gamalt loyniorð:",
"newpassword": "Nýtt loyniorð:",
"diff-multi-manyusers": "({{PLURAL:$1|Ein versjón sum liggur ímillum|$1 versjónir sum liggja ímillum}} skrivaðar av meira enn $2 {{PLURAL:$2|brúkara|brúkarum}} ikki víst)",
"searchresults": "Leitúrslit",
"searchresults-title": "Leiti úrslit fyri \"$1\"",
- "toomanymatches": "Alt ov nógvar úrslit vóru funnin, vinarliga royn aftur við nýggjum fyrispurningi",
"titlematches": "Síðu heiti samsvarar",
"textmatches": "Teksturin á síðuni samsvarar",
"notextmatches": "Ongin síðutekstur samsvarar",
"לערי ריינהארט",
"아라",
"Scoopfinder",
- "Akeron"
+ "Akeron",
+ "Linedwell"
]
},
"tog-underline": "Souligner les liens :",
"qbmyoptions": "Mes pages",
"faq": "FAQ",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Ajouter un sujet",
- "vector-action-delete": "Supprimer",
- "vector-action-move": "Renommer",
- "vector-action-protect": "Protéger",
- "vector-action-undelete": "Rétablir",
- "vector-action-unprotect": "Changer la protection",
- "vector-view-create": "Créer",
- "vector-view-edit": "Modifier",
- "vector-view-history": "Historique",
- "vector-view-view": "Lire",
- "vector-view-viewsource": "Voir la source",
"actions": "Actions",
- "vector-more-actions": "Plus",
"namespaces": "Espaces de noms",
"variants": "Variantes",
"navigation-heading": "Menu de navigation",
"preview": "Prévisualisation",
"showpreview": "Prévisualiser",
"showdiff": "Voir les modifications",
- "anoneditwarning": "'''Attention :''' vous n’êtes pas identifié(e). Votre adresse IP sera enregistrée dans l’historique de cette page.",
+ "anoneditwarning": "<strong>Attention :</strong> Vous n’êtes pas identifié(e). Votre adresse IP sera enregistrée dans l’historique de cette page.",
"anonpreviewwarning": "''Vous n’êtes pas identifié(e). Sauvegarder enregistrera votre adresse IP dans l’historique des modifications de la page.''",
"missingsummary": "'''Rappel :''' vous n'avez pas encore fourni le résumé de votre modification.\nSi vous cliquez de nouveau sur le bouton « {{int:savearticle}} », la publication sera faite sans nouvel avertissement.",
"missingcommenttext": "Veuillez entrer un commentaire ci-dessous.",
"mergehistory-empty": "Aucune version ne peut être fusionnée.",
"mergehistory-success": "$3 version{{PLURAL:$3||s}} de [[:$1]] fusionnée{{PLURAL:$3||s}} dans [[:$2]].",
"mergehistory-fail": "Impossible de procéder à la fusion des historiques. Resélectionner la page ainsi que les paramètres de date.",
+ "mergehistory-fail-toobig": "Impossible d’effectuer la fusion de l’historique car un nombre de {{PLURAL:$1|révisions}} supérieur à la limite de $1 devrait être déplacé.",
"mergehistory-no-source": "La page d'origine $1 n'existe pas.",
"mergehistory-no-destination": "La page de destination $1 n'existe pas.",
"mergehistory-invalid-source": "La page d'origine doit avoir un titre valide.",
"difference-missing-revision": "{{PLURAL:$2|Une révision|$2 révisions}} de cette différence ($1) {{PLURAL:$2|n'a pas été trouvée|n'ont pas été trouvées}}.\n\nCela survient en général en suivant un lien de différence obsolète vers une page qui a été supprimée.\nVous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
"searchresults": "Résultats de la recherche",
"searchresults-title": "Résultats de recherche pour « $1 »",
- "toomanymatches": "Un trop grand nombre d'occurrences a été renvoyé, veuillez soumettre une requête différente.",
"titlematches": "Correspondances dans les titres des pages",
"textmatches": "Correspondances dans le texte des pages",
"notextmatches": "Aucun texte de page ne correspond à la recherche.",
"largefileserver": "La taille de ce fichier est supérieure au maximum autorisé.",
"emptyfile": "Le fichier que vous voulez importer semble vide.\nCeci peut être dû à une erreur dans le nom du fichier.\nVeuillez vérifier que vous désirez vraiment importer ce fichier.",
"windows-nonascii-filename": "Ce wiki ne supporte pas les noms de fichiers avec des caractères spéciaux.",
- "fileexists": "Un fichier existe déjà sous ce nom.\nMerci de vérifier <strong>[[:$1]]</strong> si vous n'êtes pas certain{{GENDER:||e|}} de vouloir le modifier.\n[[$1|thumb]]",
+ "fileexists": "Un fichier existe déjà sous ce nom.\nMerci de vérifier <strong>[[:$1]]</strong> si vous n'êtes pas certain{{GENDER:||e|}} de vouloir le remplacer.\n[[$1|thumb]]",
"filepageexists": "La page de description pour ce fichier a déjà été créée ici <strong>[[:$1]]</strong>, mais aucun fichier n'existe actuellement sous ce nom.\nLe résumé que vous allez spécifier n'apparaîtra pas sur la page de description.\nPour que ce soit le cas, vous devrez modifier manuellement la page. [[$1|thumb]]",
- "fileexists-extension": "Un fichier existe avec un nom proche : [[$2|thumb]]\n* Nom du fichier à importer : <strong>[[:$1]]</strong>\n* Nom du fichier existant : <strong>[[:$2]]</strong>\nVeuillez choisir un autre nom.",
+ "fileexists-extension": "Un fichier existe avec un nom proche : [[$2|thumb]]\n* Nom du fichier à importer : <strong>[[:$1]]</strong>\n* Nom du fichier existant : <strong>[[:$2]]</strong>\nPeut-être voulez-vous utiliser un nom plus explicite ?",
"fileexists-thumbnail-yes": "Le fichier semble être une image en taille réduite ''(vignette)''. [[$1|thumb]]\nVeuillez vérifier le fichier <strong>[[:$1]]</strong>.\nSi le fichier vérifié est la même image avec la taille initiale, il n'y a pas besoin d'importer une version réduite.",
"file-thumbnail-no": "Le nom du fichier commence par <strong>$1</strong>.\nIl est possible qu'il s'agisse d'une version réduite ''(vignette)''.\nSi vous disposez du fichier en haute résolution, importez-le, sinon veuillez modifier son nom.",
"fileexists-forbidden": "Un fichier avec ce nom existe déjà et ne peut pas être écrasé.\nSi vous voulez toujours importer votre fichier, veuillez revenir en arrière et utiliser un autre nom. [[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "La suppression et restauration de fichiers est temporairement désactivée durant la maintenance.",
"filedelete-maintenance-title": "Impossible de supprimer le fichier",
"mimesearch": "Recherche par type de contenu MIME",
- "mimesearch-summary": "Cette page vous permet de lister les fichiers accessibles par ce wiki en fonction de leur type de contenu MIME.\nEntrée : ''typedecontenu''/''sous-type'', par exemple <code>image/jpeg</code>.",
+ "mimesearch-summary": "Cette page vous permet de filtrer les fichiers par leur type de contenu MIME.\nEntrée : type_de_contenu/sous-type ou type_de_contenu/*, par ex. <code>image/jpeg</code>.",
"mimetype": "Type MIME :",
"download": "télécharger",
"unwatchedpages": "Pages ne faisant partie d’aucune liste de suivi",
"tooltip-preferences-save": "Sauvegarder les préférences",
"tooltip-summary": "Entrez un bref résumé",
"interlanguage-link-title": "$1 — $2",
+ "interlanguage-link-title-nonlang": "$1 — $2",
"common.css": "/* Le CSS placé ici sera appliqué à tous les habillages. */",
- "monobook.css": "/* Le CSS placé ici affectera les utilisateurs de l’habillage Monobook. */",
- "vector.css": "/* Le CSS placé ici affectera les utilisateurs de l’habillage Vector. */",
"print.css": "/* Le CSS placé ici affectera les impressions */",
"noscript.css": "/* Le CSS placé ici affectera les utilisateurs ayant désactivé Javascript. */",
"group-autoconfirmed.css": "/* Le CSS placé ici affectera les utilisateurs auto-confirmés seulement. */",
"group-sysop.css": "/* Le CSS inclus ici n’affectera que les administrateurs */",
"group-bureaucrat.css": "/* Le CSS inclus ici n’affectera que les bureaucrates */",
"common.js": "/* Tout JavaScript ici sera chargé avec chaque page accédée par n’importe quel utilisateur. */",
- "monobook.js": "/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage MonoBook uniquement. */",
- "vector.js": "/* Tout code JavaScript placé ici sera chargé pour les utilisateurs de l’habillage Vector */",
"group-autoconfirmed.js": "/* Le JavaScript inclus ici n’affectera que les utilisateurs auto-confirmés */",
"group-user.js": "/* Le JavaScript placé ici ne sera chargé que pour les utilisateurs enregistrés. */",
"group-bot.js": "/* Le JavaScript inclus ici n’affectera que les robots */",
"pageinfo-category-pages": "Nombre de pages",
"pageinfo-category-subcats": "Nombre de sous-catégories",
"pageinfo-category-files": "Nombre de fichiers",
- "skinname-monobook": "Monobook",
- "skinname-vector": "Vector",
"markaspatrolleddiff": "Marquer comme relue",
"markaspatrolledtext": "Marquer cette page comme relue",
"markedaspatrolled": "Marquée comme relue",
"version-hook-name": "Nom du greffon",
"version-hook-subscribedby": "Abonnés :",
"version-version": "(version $1)",
+ "version-no-ext-name": "[pas de nom]",
"version-license": "Licence MediaWiki",
"version-ext-license": "Licence",
"version-ext-colheader-name": "Extension",
"qbmyoptions": "Min sidjen",
"faq": "FAQ",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Nei kirew began",
- "vector-action-delete": "Strik",
- "vector-action-move": "Fersküüw",
- "vector-action-protect": "Seekre",
- "vector-action-undelete": "Weder iinstel",
- "vector-action-unprotect": "Sidjenseekerhaid",
- "vector-view-create": "Maage",
- "vector-view-edit": "Bewerke",
- "vector-view-history": "Ferluup uunluke",
- "vector-view-view": "Lees",
- "vector-view-viewsource": "Kweltekst uunluke",
"actions": "Aktjuunen",
"namespaces": "Nöömrümer",
"variants": "Warianten",
"difference-missing-revision": "{{PLURAL:$2|Ian werjuun|$2 werjuunen}} faan di ferskeel ($1) {{PLURAL:$2|as|san}} ei fünjen wurden.\n\nDet komt diar miast faan, dat en ual ferwisang stregen wurden as.\nDü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} logbuk faan stregen sidjen] efterlees.",
"searchresults": "Fünjen sidjen",
"searchresults-title": "Fünjen sidjen för „$1“",
- "toomanymatches": "Diar kaam tuföl resultaaten üüb din uunfraag. Ferschük det ööders.",
"titlematches": "Auerianstemangen mä sidjennöömer",
"textmatches": "Auerianstemangen mä teksten",
"notextmatches": "Nian auerianstemangen mä teksten",
"Urhixidur",
"Vipuser",
"Xiaomingyan",
- "아라"
+ "아라",
+ "Mywood"
]
},
"tog-underline": "下划链接",
"qbmyoptions": "偶𠮶选项",
"faq": "FAQ",
"faqpage": "Project:问得蛮多𠮶问题",
- "vector-action-addsection": "添主题",
- "vector-action-delete": "删吥",
- "vector-action-move": "移吥",
- "vector-action-protect": "护到",
- "vector-action-undelete": "望下删吥𠮶页面",
- "vector-action-unprotect": "更改保护",
- "vector-view-create": "创建",
- "vector-view-edit": "编辑",
- "vector-view-history": "望下历史",
- "vector-view-view": "读",
- "vector-view-viewsource": "望下原始码",
"actions": "动作",
"namespaces": "空间名",
"variants": "变换",
"history_short": "历史",
"updatedmarker": "最末道浏览后𠮶改动",
"printableversion": "可打印版本",
- "permalink": "永久链接",
+ "permalink": "固定链接",
"print": "打印",
"view": "眵",
"edit": "编写",
"enterlockreason": "请输入锁到数据库𠮶理由,包括预计几时间解锁",
"readonlytext": "数据库上嘞锁改伓正,可能佢正维修中,搞正嘞仰上会还原。管理员𠮶解释: $1",
"missing-article": "资料库冇寻到倷要𠮶版面,「$1」 $2。\n\n通常个系因为修订历史页上头,过时𠮶连结连到删吥𠮶版面咁舞得𠮶。\n\n如果不系咁,倷可能系寻到软件里头𠮶bug。\n请记得 URL 𠮶地址,向[[Special:ListUsers/sysop|管理员]]报告。",
- "missingarticle-rev": "(修订#: $1)",
+ "missingarticle-rev": "(版本#: $1)",
"missingarticle-diff": "(差异: $1, $2)",
"readonly_lag": "附属数据库服务器拿缓存更新到主服务器,数据库自动锁到嘞",
"internalerror": "内部错误",
"rev-delundel": "显示/弆到",
"rev-showdeleted": "敨开",
"revisiondelete": "删除/反删除修改",
- "revdelete-nooldid-title": "冇目标修订",
+ "revdelete-nooldid-title": "无效目标版本",
"revdelete-nooldid-text": "倷冇话个只操作𠮶目标修改。",
"logdelete-selected": "拣$1𠮶$2只日志事件:",
"revdelete-legend": "设置可见性𠮶限制",
"editundo": "还原",
"searchresults": "寻到𠮶结果",
"searchresults-title": "对\"$1\"寻到𠮶结果",
- "toomanymatches": "返回多伤喽𠮶结果,请试吖用别𠮶词语寻过",
"titlematches": "文章标题符合",
"textmatches": "页面内容符合",
"notextmatches": "冇页面内容符合",
"searchmenu-exists": "'''个只wiki已有一只叫「[[:$1]]」𠮶页。'''",
"searchmenu-new": "'''嘚个只wiki上建立「[[:$1]]」页!'''",
"searchprofile-articles": "内容页",
- "searchprofile-project": "帮助同得计划页",
"searchprofile-images": "多媒体",
"searchprofile-everything": "所有",
"searchprofile-advanced": "高级",
"searchprofile-articles-tooltip": "到$1里头寻",
- "searchprofile-project-tooltip": "到$1里头寻",
"searchprofile-images-tooltip": "寻档案",
"searchprofile-everything-tooltip": "寻所有内容(包括谈𫍡页)",
"searchprofile-advanced-tooltip": "到自定名字空间里头寻",
"servertime": "服务器时间",
"guesstimezone": "到浏览器上填",
"allowemail": "接受别𠮶用户𠮶邮件",
- "defaultns": "默认搜索𠮶名字空间:",
"default": "默认",
"prefs-files": "档案",
"youremail": "电子邮件:",
"username": "用户名:",
- "uid": "用户ID:",
"yourrealname": "真名:",
"yourlanguage": "语言:",
"yourvariant": "多款内容语言:",
"logempty": "日志里头冇符合𠮶项目。",
"log-title-wildcard": "寻吖个只字开头𠮶标题",
"allpages": "所有𠮶页面",
- "alphaindexline": "$1到$2",
"nextpage": "下页($1)",
"prevpage": "上页($1)",
"allpagesfrom": "显示以个底开始𠮶页面:",
"exbeforeblank": "拖清空之前𠮶内容系: '$1'",
"delete-confirm": "删卟\"$1\"去",
"delete-legend": "删卟去",
- "historywarning": "'''警告''': 倷要删卟𠮶页面含到$1到{{PLURAL:$1|修订|修订}}𠮶历史",
+ "historywarning": "'''警告''': 倷要删卟𠮶页面含到$1到{{PLURAL:$1|版本}}𠮶历史",
"confirmdeletetext": "仰上倷就要永久删卟数据库𠮶一只页面或图像同佢𠮶历史。请确定倷要啖做,哈要晓得佢𠮶后果,更加伓能违反[[{{MediaWiki:Policy-url}}]]。",
"actioncomplete": "扤正嘞",
"actionfailed": "操作冇舞正",
"undelete-search-prefix": "显示以下底开头𠮶页面:",
"undelete-search-submit": "寻吖",
"undelete-no-results": "删卟记录冇合到𠮶结果。",
- "undelete-filename-mismatch": "删伓正带到时间标记𠮶档案修订 $1: 档案伓匹配",
+ "undelete-filename-mismatch": "删伓正带到时间标记𠮶档案版本$1: 档案伓匹配",
"undelete-bad-store-key": "删伓正带到时间标记𠮶档案修订 $1: 档案删卟之前就跌卟嘞。",
"undelete-cleanup-error": "删卟冇用𠮶存盘文件 \"$1\" 时出错。",
"undelete-missing-filearchive": "数据库冇档案存盘 ID $1 ,故系佢也就到档案存盘恢复伓正。佢话伓定早反删除嘞。",
"sp-contributions-userrights": "用户权限管理",
"sp-contributions-search": "寻贡献",
"sp-contributions-username": "IP地址或用户名:",
- "sp-contributions-toponly": "光显示最晏修订版本𠮶编辑",
+ "sp-contributions-toponly": "光显示最晏版本𠮶编辑",
"sp-contributions-submit": "寻",
"whatlinkshere": "有什哩连到个首",
"whatlinkshere-title": "连到 $1 𠮶页面",
"tooltip-t-upload": "上传图像或多媒体文件",
"tooltip-t-specialpages": "全部特殊页列表",
"tooltip-t-print": "个只页面𠮶打印版",
- "tooltip-t-permalink": "个只页面𠮶永久链接",
+ "tooltip-t-permalink": "个只页面𠮶固定链接",
"tooltip-ca-nstab-main": "望吖内容页",
"tooltip-ca-nstab-user": "望吖用户页",
"tooltip-ca-nstab-media": "望吖媒体页",
"tooltip-undo": "『复原』可以到编辑模式里头开只编辑表以便复原。佢容许到摘要里头加进原因。",
"tooltip-summary": "输入只简要",
"common.css": "/** 个首𠮶CSS会用到全部𠮶皮肤 */",
- "monobook.css": "/* 个首𠮶 CSS 会碍到正用Monobook皮肤𠮶用户 */",
"common.js": "/* 个首𠮶JavaScript仰上载进到所有用户全部页面。 */",
- "monobook.js": "/* 伓再使用;请用[[MediaWiki:common.js]] */",
"anonymous": "{{SITENAME}}𠮶匿名用户",
"siteuser": "{{SITENAME}}用户$1",
"anonuser": "{{SITENAME}}匿名用户$1",
"Urhixidur",
"Vipuser",
"Xiaomingyan",
- "아라"
+ "아라",
+ "Mywood"
]
},
"tog-underline": "下劃連結",
"qbmyoptions": "我嗰頁面",
"faq": "FAQ",
"faqpage": "Project:問得蠻多嗰問題",
- "vector-action-addsection": "添主題",
- "vector-action-delete": "刪吥",
- "vector-action-move": "移吥",
- "vector-action-protect": "護到",
- "vector-action-undelete": "望下刪吥嗰頁面",
- "vector-action-unprotect": "解除保護",
- "vector-view-create": "創建",
- "vector-view-edit": "編輯",
- "vector-view-history": "望下歷史",
- "vector-view-view": "讀",
- "vector-view-viewsource": "望下原始碼",
"actions": "動作",
"namespaces": "空間名",
"variants": "變換",
"history_short": "歷史",
"updatedmarker": "頂晏嗰許到瀏覽後嗰改動",
"printableversion": "可打印版本",
- "permalink": "永久連結",
+ "permalink": "固定連結",
"print": "打印",
"view": "眵",
"edit": "編寫",
"editundo": "還原",
"searchresults": "尋到嗰結果",
"searchresults-title": "對「$1」尋到嗰結果",
- "toomanymatches": "返回多傷哩嗰結果,請較下用別嗰詞語尋過",
"titlematches": "文章標題符合",
"textmatches": "頁面內容符合",
"notextmatches": "冇頁面內容符合",
"searchmenu-exists": "'''箇隻wiki已有一隻叫「[[:$1]]」嗰頁。'''",
"searchmenu-new": "'''到箇隻wiki上建立「[[:$1]]」頁!'''",
"searchprofile-articles": "內容頁",
- "searchprofile-project": "幫助同得計劃頁",
"searchprofile-images": "多媒體",
"searchprofile-everything": "所有",
"searchprofile-advanced": "高級",
"searchprofile-articles-tooltip": "到$1裡頭尋",
- "searchprofile-project-tooltip": "到$1裡頭尋",
"searchprofile-images-tooltip": "尋檔案",
"searchprofile-everything-tooltip": "尋所有內容(包括談詑頁)",
"searchprofile-advanced-tooltip": "到自定名字空間裡頭尋",
"servertime": "服務器時間",
"guesstimezone": "到瀏覽器上填",
"allowemail": "接受別嗰用戶嗰郵件",
- "defaultns": "默認搜索嗰名字空間:",
"default": "預設",
"prefs-files": "檔案",
"youremail": "電子郵件:",
"username": "用戶名:",
- "uid": "用戶ID:",
"yourrealname": "真名:",
"yourlanguage": "語言:",
"yourvariant": "多款內容語言:",
"logempty": "日誌裡頭冇符合嗰項目。",
"log-title-wildcard": "尋吖箇隻字開頭嗰標題",
"allpages": "所有嗰頁面",
- "alphaindexline": "$1到$2",
"nextpage": "下頁($1)",
"prevpage": "上頁($1)",
"allpagesfrom": "顯示以箇底開始嗰頁面:",
"tooltip-t-upload": "上傳圖像或多媒體文件",
"tooltip-t-specialpages": "全部特殊頁嗰清單",
"tooltip-t-print": "箇隻頁面嗰打印版",
- "tooltip-t-permalink": "箇隻頁面嗰永久連結",
+ "tooltip-t-permalink": "箇隻頁面嗰固定連結",
"tooltip-ca-nstab-main": "望下內容頁",
"tooltip-ca-nstab-user": "望下用戶頁",
"tooltip-ca-nstab-media": "望吖媒體頁",
"tooltip-undo": "『復原』可以到編輯模式裡頭開隻編輯表以便復原。佢容許到摘要裡頭加進原因。",
"tooltip-summary": "輸入隻簡要",
"common.css": "/** 箇首嗰CSS會用到全部嗰皮膚 */",
- "monobook.css": "/* 箇首嗰 CSS 會礙到正用Monobook皮膚嗰用戶 */",
"common.js": "/* 箇首嗰JavaScript仰上載進到所有用戶全部頁面。 */",
- "monobook.js": "/* 伓再使用;請用[[MediaWiki:common.js]] */",
"anonymous": "{{SITENAME}}嗰匿名用戶",
"siteuser": "{{SITENAME}}用戶$1",
"anonuser": "{{SITENAME}}匿名用戶$1",
"Sionnach",
"Steafan31",
"לערי ריינהארט",
- "아라"
+ "아라",
+ "GunChleoc"
]
},
"tog-underline": "Fo-loidhneadh nan ceanglaichean:",
"tog-hideminor": "Falaich mùthaidhean beaga ann an liosta nam mùthaidhean ùra",
- "tog-hidepatrolled": "Falaich mùthaidhean fo fhaire ann an liosta nam mùthaidhean ùra",
- "tog-newpageshidepatrolled": "Falaich duilleagan fo fhaire ann an liosta nan duilleagan ùra",
+ "tog-hidepatrolled": "Falaich mùthaidhean fo fhreiceadan ann an liosta nam mùthaidhean ùra",
+ "tog-newpageshidepatrolled": "Falaich duilleagan fo fhreiceadan ann an liosta nan duilleagan ùra",
"tog-extendwatchlist": "Leudaich an clàr-faire gus an seall e gach mùthadh 's chan ann an fheadhainn as ùire a-mhàin",
"tog-usenewrc": "Buidhnich na h-atharraichean a-rèir duilleige sna mùthaidhean ùra agus air a' chlàr-fhaire",
"tog-numberheadings": "Cuir àireamhan ri ceann-sgrìobhaidhean leis fhèin",
"tog-previewontop": "Nochd an ro-shealladh os cionn a' bhogsa deasachaidh",
"tog-previewonfirst": "Nochd an ro-shealladh nuair a nithear a' chiad deasachadh",
"tog-enotifwatchlistpages": "Cuir post-dealain thugam nuair a mhùthar duilleag a tha air a' chlàr-fhaire agam",
- "tog-enotifusertalkpages": "Cuir post-dealain thugam nuair a mhùthaichear duilleag mo chonaltraidh",
+ "tog-enotifusertalkpages": "Cuir post-dealain thugam nuair a thèid duilleag mo dheasbaireachd atharrachadh",
"tog-enotifminoredits": "Cuir post-dealain thugam nuair a nithear mùthadh beag air duilleagan cuideachd",
- "tog-enotifrevealaddr": "Nochd an seòladh puist-dhealain agam ann am teachdaireachdan fiosrachaidh",
+ "tog-enotifrevealaddr": "Nochd an seòladh puist-d agam ann am brathan-naidheachd puist-d",
"tog-shownumberswatching": "Nochd àireamh nan cleachdaichean a tha a' cumail sùil air",
"tog-oldsig": "An t-earr-sgrìobhadh làithreach:",
"tog-fancysig": "Làimhsich an t-earr-sgrìobhadh mar wikitext (gun cheangal leis fhèin)",
"tog-watchlisthideminor": "Falaich mùthaidhean beaga air mo chlàr-faire",
"tog-watchlisthideliu": "Falaich mùthaidhean le cleachdaichean a tha air logadh a-steach air mo chlàr-faire",
"tog-watchlisthideanons": "Falaich mùthaidhean le cleachdaichean gun ainm air mo chlàr-faire",
- "tog-watchlisthidepatrolled": "Falaich mùthaidhean air duilleagan fo fhreiceadan air mo chlàr-faire",
+ "tog-watchlisthidepatrolled": "Falaich mùthaidhean air duilleagan fo fhreiceadan air a' chlàr-fhaire agam",
"tog-ccmeonemails": "Cuir lethbhric de phuist-dhealain a chuireas mi do chleachdaichean eile thugam",
- "tog-diffonly": "Na seall susbaint nan duilleagan fo na diofaichean",
- "tog-showhiddencats": "Seall na roinnean falaichte",
- "tog-norollbackdiff": "Na dèan diof às dèidh roiligeadh air ais",
+ "tog-diffonly": "Na seall susbaint nan duilleagan fo na diofaran",
+ "tog-showhiddencats": "Seall na roinnean-seòrsa falaichte",
+ "tog-norollbackdiff": "Na seall na diofaran às dèidh roladh air ais",
"tog-useeditwarning": "Thoir rabhadh dhomh ma bhios mi an impis duilleag deasachaidh fhàgail mus do shàbhail mi na mùthaidhean agam",
"tog-prefershttps": "Cleachd ceangal tèarainte an-còmhnaidh nuair a bhios mi clàraichte a-staigh",
"underline-always": "An-còmhnaidh",
"october-date": "$1 dhen Dàmhair",
"november-date": "$1 dhen t-Samhain",
"december-date": "$1 dhen Dùbhlachd",
- "pagecategories": "{{PLURAL:$1|Roinn-seòrsa|Roinn-seòrsa|Roinnean-seòrsa|Roinn-seòrsa}}",
- "category_header": "Duilleagan sa roinn \"$1\"",
- "subcategories": "Fo-roinnean",
- "category-media-header": "Meadhanan sa roinn \"$1\"",
- "category-empty": "''Chan eil duilleagan no meadhanan san roinn seo an-dràsta.''",
- "hidden-categories": "{{PLURAL:$1|Roinn-seòrsa fhalaichte|Roinn-seòrsa fhalaichte|Roinnean-seòrsa falaichte|Roinn-seòrsa fhalaichte}}",
- "hidden-category-category": "Roinnean falaichte",
- "category-subcat-count": "{{PLURAL:$2|Chan eil san roinn-seòrsa ach an fho-roinn-seòrsa a leanas.|Tha {{PLURAL:$1|an fho-roinn-seòrsa|an $1 fho-roinn-seòrsa|na $1 fo-roinnean-seòrsa|na $1 fo-roinn-seòrsa}}, aig an roinn-seòrsa a leanas, a-mach à $2 uile gu lèir.}}",
- "category-subcat-count-limited": "Tha {{PLURAL:$1|an fho-roinn-seòrsa|na fo-roinntean-seòrsa}} a leanas sa roinn-seòrsa seo.",
- "category-article-count": "{{PLURAL:$2|Chan eil ach an duilleag a leanas san fho-roinn-seòrsa seo.|Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa seo, a-mach à $2 uile gu lèir.}}",
- "category-article-count-limited": "Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa làithreach.",
- "category-file-count": "{{PLURAL:$2|Chan eil ach am faidhle a leanas san fho-roinn-seòrsa seo.|Tha {{PLURAL:$1|am faidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa seo, a-mach à $2 uile gu lèir.}}",
- "category-file-count-limited": "Tha {{PLURAL:$1|am faidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa làithreach.",
+ "pagecategories": "{{PLURAL:$1|Roinn-seòrsa|Roinnean-seòrsa}}",
+ "category_header": "Duilleagan san roinn-seòrsa \"$1\"",
+ "subcategories": "Fo-roinnean-seòrsa",
+ "category-media-header": "Meadhanan san roinn-seòrsa \"$1\"",
+ "category-empty": "<em>Chan eil duilleagan no meadhanan san roinn-seòrsa seo an-dràsta.</em>",
+ "hidden-categories": "{{PLURAL:$1|Roinn-seòrsa fhalaichte|Roinnean-seòrsa falaichte}}",
+ "hidden-category-category": "Roinnean-seòrsa falaichte",
+ "category-subcat-count": "{{PLURAL:$2|Chan eil ach an fho-roinn-seòrsa a leanas san roinn-seòrsa seo.|Tha {{PLURAL:$1|an fho-roinn-seòrsa|na $1 fo-roinnean-seòrsa}} a leanas san roinn-seòrsa (a-mach à $2 uile gu lèir).}}",
+ "category-subcat-count-limited": "Tha {{PLURAL:$1|an fho-roinn-seòrsa|na fo-roinnean-seòrsa}} a leanas san roinn-seòrsa seo.",
+ "category-article-count": "{{PLURAL:$2|Chan eil ach an duilleag a leanas san roinn-seòrsa seo.|Tha {{PLURAL:$1|an $1 duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa seo (a-mach à $2 uile gu lèir).}}",
+ "category-article-count-limited": "Tha {{PLURAL:$1|an $1 duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa làithreach.",
+ "category-file-count": "{{PLURAL:$2|Chan eil ach am faidhle a leanas san roinn-seòrsa seo.|Tha {{PLURAL:$1|an $1 fhaidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa seo (a-mach à $2 uile gu lèir).}}",
+ "category-file-count-limited": "Tha {{PLURAL:$1|an $1 fhaidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa làithreach.",
"listingcontinuesabbrev": "(an corr)",
"index-category": "Duilleagan air a' chlàr-innse",
"noindex-category": "Duilleagan nach eil air a' chlàr-innse",
"broken-file-category": "Duilleagan sa bheil ceanglaichean faidhle a tha briste",
+ "categoryviewer-pagedlinks": "($1) ($2)",
"about": "Mu",
"article": "Duilleag susbainte",
"newwindow": "(a' fosgladh ann an uinneag ùr)",
"morenotlisted": "Chan eil an liosta seo iomlan.",
"mypage": "Duilleag",
"mytalk": "Deasbaireachd",
- "anontalk": "Conaltradh airson an IP seo",
+ "anontalk": "Deasbaireachd airson an IP seo",
"navigation": "Seòladh",
"and": " agus",
"qbfind": "Lorg",
"qbmyoptions": "Na duilleagan agam",
"faq": "CÀBHA",
"faqpage": "Project:CÀBHA",
- "vector-action-addsection": "Cuir ris cuspair",
- "vector-action-delete": "Sguab às",
- "vector-action-move": "Gluais",
- "vector-action-protect": "Dìon",
- "vector-action-undelete": "Neo-dhèan an sguabadh às",
- "vector-action-unprotect": "Atharraich an dìon",
- "vector-view-create": "Cruthaich",
- "vector-view-edit": "Deasaich",
- "vector-view-history": "Seall an eachdraidh",
- "vector-view-view": "Leugh",
- "vector-view-viewsource": "Seall an tùs",
"actions": "Gnìomhan",
- "namespaces": "Namespaces",
+ "namespaces": "Ainm-spàsan",
"variants": "Tionndaidhean",
"navigation-heading": "Clàr-taice na seòladaireachd",
"errorpagetitle": "Mearachd",
"delete": "Sguab às",
"deletethispage": "Sguab às an duilleag seo",
"undeletethispage": "Neo-dhèan sguabadh às na duilleige seo",
- "undelete_short": "Neo-dhèan sguabadh às de {{PLURAL:$1|dh'aon deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}}",
- "viewdeleted_short": "Seall {{PLURAL:$1|aon deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}} a chaidh a sguabadh às",
+ "undelete_short": "Neo-dhèan an sguabadh às air $1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}}",
+ "viewdeleted_short": "Seall $1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}} a chaidh a sguabadh às",
"protect": "Dìon",
"protect_change": "mùth",
"protectthispage": "Dìon an duilleag seo",
"mediawikipage": "Seall duilleag na teachdaireachd",
"templatepage": "Seall duilleag na teamplaide",
"viewhelppage": "Seall an duilleag cobharach",
- "categorypage": "Seall duilleag na roinne",
+ "categorypage": "Seall duilleag na roinn-seòrsa",
"viewtalkpage": "Seall an deasbaireachd",
"otherlanguages": "Ann an cànain eile",
"redirectedfrom": "(Air ath-sheòladh o $1)",
"redirectpagesub": "Ath-sheòl an duilleag",
"lastmodifiedat": "Chaidh an duilleag seo a mhùthadh $1 aig $2 turas mu dheireadh.",
- "viewcount": "Chaidh inntrigeadh a dhèanamh dhan duilleag seo {{PLURAL:$1|aon turas|$1 thuras|$1 turais|$1 turas}}.",
+ "viewcount": "Chaidh inntrigeadh a dhèanamh dhan duilleag seo $1 {{PLURAL:$1|turas|thuras|tursan|turas}}.",
"protectedpage": "Duilleag fo dhìon",
"jumpto": "Gearr leum gu:",
"jumptonavigation": "seòladh",
"aboutsite": "Mu dhèidhinn {{SITENAME}}",
"aboutpage": "Project:Mu dhèidhinn",
"copyright": "Tha susbaint ri làimh fo $1 mur eil an caochladh 'ga innse.",
- "copyrightpage": "{{ns:project}}:Còraichean lethbhric",
+ "copyrightpage": "{{ns:project}}:Còraichean-lethbhreac",
"currentevents": "Cùisean an latha",
"currentevents-url": "Project:Cùisean an latha",
"disclaimers": "Aithrisean-àichidh",
"privacypage": "Project:Am polasaidh prìobhaideachd",
"badaccess": "Meareachd le cead",
"badaccess-group0": "Chan eil cead agad an gnìomh a dh'iarr thu a thoirt gu buil.",
- "badaccess-groups": "Tha an gnìomh a dh'iarr thu cuingichte 's cha dèan ach buill {{PLURAL:$2|a' bhuidhinn|nam buidhnean}} a leanas e: $1.",
+ "badaccess-groups": "Chan fhaod ach buill {{PLURAL:$2|dhen bhuidheann|dhe na buidhnean}} an gnìomh a dh'iarr thu a dhèanamh: $1.",
"versionrequired": "Feum air tionndadh $1 de MhediaWiki",
"versionrequiredtext": "Tha feum air tionndadh $1 de MhediaWiki mus faicear an duilleag seo.\nSeall air [[Special:Version|duilleag an tionndaidh]].",
"ok": "Ceart ma-thà",
+ "pagetitle": "$1 - {{SITENAME}}",
+ "pagetitle-view-mainpage": "{{SITENAME}}",
+ "backlinksubtitle": "← $1",
"retrievedfrom": "Air a tharraing à \"$1\"",
- "youhavenewmessages": "Tha $1 ($2) agad.",
- "youhavenewmessagesfromusers": "Tha $1 o {{PLURAL:$3|aon chleachdaiche|$3 chleachdaiche|$3 cleachdaichean|$3 cleachdaiche}} agad ($2).",
+ "youhavenewmessages": "Tha $1 agad ($2).",
+ "youhavenewmessagesfromusers": "Tha $1 o $3 {{PLURAL:$3|chleachdaiche|chleachdaiche|cleachdaichean|cleachdaiche}} agad ($2).",
"youhavenewmessagesmanyusers": "Tha $1 agad o iomadh cleachdaiche ($2).",
- "newmessageslinkplural": "{{PLURAL:$1|teachdaireachd ùr|theachdaireachd ùr|theachdaireachdan ùra|teachdaireachd ùr}}",
- "newmessagesdifflinkplural": "{{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} mu dheireadh",
+ "newmessageslinkplural": "{{PLURAL:$1|teachdaireachd ùr|teachdaireachdan ùra}}",
+ "newmessagesdifflinkplural": "{{PLURAL:$1|am mùthadh|na mùthaidhean}} mu dheireadh",
"youhavenewmessagesmulti": "Tha teachdaireachdan ùra agad ann an $1",
"editsection": "deasaich",
"editold": "deasaich",
"hidetoc": "falaich",
"collapsible-collapse": "Co-theannaich",
"collapsible-expand": "Leudaich",
- "thisisdeleted": "Seall no aisig $1?",
- "viewdeleted": "Seall $1?",
- "restorelink": "{{PLURAL:$1|aon deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}} a chaidh a sguabadh às",
+ "thisisdeleted": "A bheil thu airson $1 a shealltainn no aiseag?",
+ "viewdeleted": "A bheil thu airson $1 a shealltainn?",
+ "restorelink": "$1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}} a chaidh a sguabadh às",
"feedlinks": "Inbhir:",
"feed-invalid": "Seòrsa mì-dhligheach de dh'fho-sgrìobhadh inbhir.",
"feed-unavailable": "Chan eil inbhirean co-bhanntachd ri fhaighinn",
"site-atom-feed": "$1 Inbhir Atom",
"page-rss-feed": "\"$1\" Inbhir RSS",
"page-atom-feed": "\"$1\" Inbhir Atom",
+ "feed-atom": "Atom",
+ "feed-rss": "RSS",
"red-link-title": "$1 (chan eil duilleag ann fhathast)",
"sort-descending": "Seòrsaich a' tèarnadh",
"sort-ascending": "Seòrsaich a' dìreadh",
"nstab-mediawiki": "Teachdaireachd",
"nstab-template": "Teamplaid",
"nstab-help": "Cuideachadh",
- "nstab-category": "Roinn",
+ "nstab-category": "Roinn-seòrsa",
"nosuchaction": "Chan eil a leithid de ghnìomh ann",
"nosuchactiontext": "Tha an gnìomh a shònraich an t-URL mì-dhligheach.\nFaodaidh gun do chuir thu a-steach URL mearachdach no gun do lean thu ri ceangal mearachdach.\nCuideachd, faodaidh gu bheil seo 'na chomharradh air buga sa bhathar-bhog aig {{SITENAME}}",
"nosuchspecialpage": "Chan eil duilleag shònraichte d' a leithid ann",
"databaseerror-query": "Ceist: $1",
"databaseerror-function": "Foincsean: $1",
"databaseerror-error": "Mearachd: $1",
- "laggedslavemode": "'''Rabhadh:''' Faodaidh nach eil ùrachaidhean a rinneadh o chionn ghoirid a' nochdadh san duilleag.",
+ "laggedslavemode": "<strong>Rabhadh:</strong> Faodaidh nach eil ùrachaidhean a rinneadh o chionn ghoirid a' nochdadh san duilleag.",
"readonly": "Stòr-dàta glaiste",
"enterlockreason": "Cuir a-steach adhbhar a' ghlais, a' gabhail a-steach tuairmeas air fuasgladh a' ghlais.",
"readonlytext": "Tha an stòr-dàta glaiste do chlàir ùra 's mùthaidhean eile, ma dh'fhaoidte air sgàth obair-chàraidh chunbhalach an stòir-dhàta 's bidh e mar as àbhaist às dèidh sin.\n\nChuir an rianadair a ghlas e an cèill na leanas: $1",
- "missing-article": "Cha do lorg an stòr-dàta teacsa de dhuilleag a bu chòir a bhith air a lorg aige 's air a bheil \"$1\" $2.\n\n'S e mùthaidhean no ceangal eachdraidheil ro shean ri duilleag a chaidh a sguabadh às a bhios coireach à seo mar is trice.\n\nMur eil seo fìor, faodaidh gun do lorg thu buga sa bhathar-bhog.\nAn dèan thu aithris air seo do [[Special:ListUsers/sysop|rianadair]], ag innse dhaibh dè an t-URL a bha ann.",
+ "missing-article": "Cha do lorg an stòr-dàta teacsa de dhuilleag a bu chòir a bhith air a lorg aige 's air a bheil \"$1\" $2.\n\n'S e diofar no ceangal eachdraidheil ro shean ri duilleag a chaidh a sguabadh às a bhios coireach à seo mar is trice.\n\nMur eil seo fìor, faodaidh gun do lorg thu buga sa bhathar-bhog.\nAn dèan thu aithris air seo do [[Special:ListUsers/sysop|rianadair]], ag innse dhaibh dè an t-URL a bha ann.",
"missingarticle-rev": "(mùthadh#: $1)",
- "missingarticle-diff": "(Diof: $1, $2)",
+ "missingarticle-diff": "(Diofar: $1, $2)",
"readonly_lag": "Chaidh an stòr-dàta a ghlasadh leis fhèin fhad 's a tha frithealaichean nan stòr-dàta tràilleach air dheireadh a' mhaighstir",
"internalerror": "Ion-mhearachd",
"internalerror_info": "Ion-mhearachd: $1",
- "filecopyerror": "Cha do ghabh lethbhreac dhen fhaidhle \"$1\" gu \"$2\".",
+ "filecopyerror": "Cha b' urrainn dhuinn lethbhreac dhen fhaidhle \"$1\" a chur gu \"$2\".",
"filerenameerror": "Cha do ghabh ainm an fhaidhle \"$1\" atharrachadh gu \"$2\".",
"filedeleteerror": "Cha do ghabh am faidhle \"$1\" a sguabadh às.",
"directorycreateerror": "Cha do ghabh am pasgan \"$1\" a chruthachadh.",
"cannotdelete": "Cha do ghabh an duilleag no am faidhle \"$1\" a sguabadh às.\nFaodaidh gun deach a sguabadh às le cuideigin eile mu thràth.",
"cannotdelete-title": "Cha ghabh an duilleag \"$1\" a sguabadh às",
"delete-hook-aborted": "Sguireadh dhen sguabadh às ri linn dubhain.\nCha deach adhbhar a thoirt seachad.",
- "no-null-revision": "Cha b' urrainn dhuinn lèirmheas neoinitheach ùr a chruthachadh dhan duilleag \"$1\"",
+ "no-null-revision": "Cha b' urrainn dhuinn mùthadh neoinitheach ùr a chruthachadh dhan duilleag \"$1\"",
"badtitle": "Droch thiotal",
- "badtitletext": "Bha an duilleag a dh'iarr thu mì-dhligheach, falamh no le tiotal eadar-chànanach no eadar-uici air a dhroch cheangal.\nFaodaidh gu bheil aon no barrachd charactairean ann nach urrainn dhut a chleachdadh ann an tiotalan.",
+ "badtitletext": "Bha an duilleag a dh'iarr thu mì-dhligheach, falamh no le tiotal eadar-chànanach no eadar-uicidh air a dhroch cheangal.\nFaodaidh gu bheil aon no barrachd charactairean ann nach urrainn dhut a chleachdadh ann an tiotalan.",
"perfcached": "Chaidh an dàta a leanas a thasgadh 's faodaidh gu bheil e air dheireadh. Tha {{PLURAL:$1|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh}} ri fhaighinn san tasgadan air a' char as motha.",
"perfcachedts": "Chaidh an dàta a leanas a thasgadh agus chaidh ùrachadh $1 turas mu dheireadh. Tha {{PLURAL:$4|$4 toradh|$4 thoradh|$4 toraidhean|$4 toradh}} ri fhaighinn san tasgadan air a' char as motha.",
"querypage-no-updates": "Tha ùrachadh air a chur à comas air an duilleag seo an-dràsta.\nCha dèid an dàta an-seo ùrachadh aig an àm seo.",
"actionthrottledtext": "Gus casg a chur air spama, chan urrainn dhut an gnìomh seo a dhèanamh ro thric am broinn ùine ghoirid agus chaidh thu thairis air a' chrìoch seo.\nFeuch ris a-rithist às a dhèidh seo.",
"protectedpagetext": "Chaidh an duilleag seo a dhìon gus casg a chur air deasachadh.",
"viewsourcetext": "'S urrainn dhut coimhead air tùs na duilleige seo 's lethbhreac a dhèanamh dheth:",
- "viewyourtext": "'S urrainn dhut coimhead air '''na mhùthaich thu''' 's lethbhreac a dhèanamh dheth air an duilleag seo:",
- "protectedinterface": "Bheir an duilleag seo dhut teacsa eadar-aghaidh airson a' bhathar-bhog air an uicipeid seo 's chaidh a ghlasadh gus casg a chur air mì-chleachdadh. Gus eadar-theangachadh atharrachadh no a chur ris airson gach uicipeid, cleachd [//translatewiki.net/ translatewiki.net], pròiseactan eadar-theangachadh MediaWiki.",
- "editinginterface": "'''Rabhadh:''' Tha thu a' deasachadh duilleag a tha 'ga chleachdadh a chum teacsa eadar-aghaidh a sholar airson a' bhathar-bhog.\nMa dh'atharraicheas tu an duilleag seo, bidh buaidh ann air coltas na h-eadar-aghaidh mar a chì càch e air an uicipeid seo.\nGus eadar-theangachadh atharrachadh no a chur ris airson gach uicipeid, cleachd [//translatewiki.net/ translatewiki.net], pròiseactan eadar-theangachadh MediaWiki.",
- "cascadeprotected": "Chaidh an duilleag seo a dhìon o dheasachadh a chionn 's gu bheil e am broinn {{PLURAL:$1|na duilleige|nan duilleagan}} a leanas a chaidh an dìon 's an roghainn \"mar eas\" air:\n$2",
- "namespaceprotected": "Chan eil cead agad duilleagan san namespace '''$1''' a dheasachadh.",
+ "viewyourtext": "'S urrainn dhut coimhead air <strong>na dheasaich thu</strong> 's lethbhreac a dhèanamh dheth air an duilleag seo:",
+ "protectedinterface": "Bheir an duilleag seo dhut teacsa eadar-aghaidh airson a' bhathar-bhog air an uicidh seo 's chaidh a ghlasadh gus casg a chur air mì-chleachdadh. Gus eadar-theangachadh atharrachadh no a chur ris airson gach uicidh, cleachd [//translatewiki.net/ translatewiki.net], pròiseactan eadar-theangachadh MediaWiki.",
+ "editinginterface": "<strong>Rabhadh:</strong> Tha thu a' deasachadh duilleag a tha 'ga chleachdadh a chum teacsa eadar-aghaidh a sholar airson a' bhathar-bhog.\nMa dh'atharraicheas tu an duilleag seo, bidh buaidh ann air coltas na h-eadar-aghaidh mar a chì càch e air an uicidh seo.\nGus eadar-theangachadh atharrachadh no a chur ris airson gach uicidh, cleachd [//translatewiki.net/ translatewiki.net], pròiseactan eadar-theangachadh MediaWiki.",
+ "cascadeprotected": "Chaidh an duilleag seo a dhìon o dheasachadh a chionn 's gu bheil e am broinn {{PLURAL:$1|na duilleige|nan duilleagan}} a leanas a chaidh a dhìon 's an roghainn \"mar eas\" air:\n$2",
+ "namespaceprotected": "Chan eil cead agad duilleagan san ainm-spàs <strong>$1</strong> a dheasachadh.",
"customcssprotected": "Chan eil cead agad an duilleag CSS seo a dheasachadh a chionn 's gu bheil na roghainnean pearsanta aig cleachdaiche eile innte.",
"customjsprotected": "Chan eil cead agad an duilleag JavaScript seo a dheasachadh a chionn 's gu bheil na roghainnean pearsanta aig cleachdaiche eile innte.",
"mycustomcssprotected": "Chan eil cead agad an duilleag CSS seo a dheasachadh.",
"myprivateinfoprotected": "Chan eil cead agad am fiosrachadh prìobhaideach agad a dheasachadh.",
"mypreferencesprotected": "Chan eil cead agad na roghainnean agad a dheasachadh.",
"ns-specialprotected": "Chan ghabh duilleagan sònraichte a dheasachadh.",
- "titleprotected": "Chaidh an duilleag seo a dhìon o chruthachadh le [[User:$1|$1]].\nSeo am mìneachadh: \"''$2''\".",
+ "titleprotected": "Chaidh an duilleag seo a dhìon o chruthachadh le [[User:$1|$1]].\nSeo am mìneachadh: \"<em>$2</em>\".",
"filereadonlyerror": "Cha ghabh am faidhle \"$1\" atharrachadh a chionn 's gu bheil ionad-tasgaidh fhaidhlichean \"$2\" ri leughadh a-mhàin.\nThug an rianaire a ghlais e seachad an t-adhbhar a leanas: \"$3\".",
- "invalidtitle-knownnamespace": "Tiotal mì-dhligheach leis an namespace \"$2\" agus an teacsa \"$3\"",
- "invalidtitle-unknownnamespace": "Tiotal mì-dhligheach leis an àireamh namespace $1 agus an teacsa \"$2\"",
+ "invalidtitle-knownnamespace": "Tiotal mì-dhligheach leis an ainm-spàs \"$2\" agus an teacsa \"$3\"",
+ "invalidtitle-unknownnamespace": "Tiotal mì-dhligheach leis an àireamh ainm-spàis $1 agus an teacsa \"$2\"",
"exception-nologin": "Chan eil thu air clàradh a-steach",
"exception-nologin-text": "Feumaidh tu [[Special:Userlogin|clàradh a-steach]] mus fhaic thu an duilleag seo no mus urrainn dhut seo a dhèanamh.",
"exception-nologin-text-manual": "Ma tha thu ag iarraidh cothrom air an duilleag no air a' ghnìomh seo, $1.",
- "virus-badscanner": "Droch cho-dhealbhachd: sganair bhìorasan neo-aithnichte: ''$1''",
+ "virus-badscanner": "Droch cho-dhealbhachd: sganair bhìorasan neo-aithnichte: <em>$1</em>",
"virus-scanfailed": "dh'fhàillig an sganadh (còd $1)",
"virus-unknownscanner": "sganair bhìorasan neo-aithnichte:",
- "logouttext": "'''Chaidh do chlàradh a-mach.'''\n\nThoir an aire gum bi coltas air cuid dhe na duilleagan mar gum biodh tu air clàradh a-steach gus am falamhaich thu tasgadan a' bhrabhsair agad.",
+ "logouttext": "<strong>Chaidh do chlàradh a-mach.</strong>\n\nThoir an aire gum bi coltas air cuid dhe na duilleagan mar gum biodh tu air clàradh a-steach gus am falamhaich thu tasgadan a' bhrabhsair agad.",
"welcomeuser": "Fàilte ort, $1",
"welcomecreation-msg": "Chaidh an cunntas agad a chruthachadh.\nNa dìochuimhnich na [[Special:Preferences|roghainnean agad air {{SITENAME}}]] a ghleusadh dhut fhèin.",
"yourname": "Ainm-cleachdaiche:",
"userlogin-resetlink": "Na dhìochuimhnich thu d' ainm is facal-faire?",
"userlogin-resetpassword-link": "Na dhìochuimhnich thu am facal-faire agad?",
"userlogin-helplink2": "Taic le clàradh a-steach",
- "userlogin-loggedin": "Chaidh do chlàradh mar {{GENDER:$1|$1}} mu thràth.\nCleachd am foirm gu h-ìosal airson clàradh a-steach mar chleachdaiche eile.",
+ "userlogin-loggedin": "Chaidh do chlàradh mar $1 mu thràth.\nCleachd am foirm gu h-ìosal airson clàradh a-steach mar chleachdaiche eile.",
"userlogin-createanother": "Cruthaich cunntas eile",
"createacct-emailrequired": "Seòladh puist-d",
"createacct-emailoptional": "Seòladh puist-d (roghainneil)",
"createacct-submit": "Cruthaich an cunntas agad",
"createacct-another-submit": "Cruthaich cunntas eile",
"createacct-benefit-heading": "Tha {{SITENAME}} 'ga chruthachadh le daoine mar thu fhèin.",
- "createacct-benefit-body1": "{{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}}",
- "createacct-benefit-body2": "{{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}}",
- "createacct-benefit-body3": "{{PLURAL:$1|chom-pàirtiche|chom-pàirtiche|com-pàirtichean|com-pàirtiche}} o chionn goirid",
+ "createacct-benefit-body1": "{{PLURAL:$1|deasachadh|deasachaidhean}}",
+ "createacct-benefit-body2": "{{PLURAL:$1|duilleag|duilleagan}}",
+ "createacct-benefit-body3": "{{PLURAL:$1|deasaiche|deasaichean}} o chionn goirid",
"badretype": "Chan eil an dà fhacal-faire a chuir thu a-steach a' freagairt ri chèile.",
"userexists": "Tha an t-ainm-cleachdaiche a chuir thu a-steach 'ga chleachdadh mu thràth.\nNach tagh thu ainm eile?",
"loginerror": "Mearachd log a-steach",
"nocookiesnew": "Chaidh an cunntas a chruthachadh ach cha do rinn thu logadh a-steach.\nTha {{SITENAME}} a' cleachdadh briosgaidean gus daoine a logadh a-steach.\nChuir thu na briosgaidean à comas.\nCuir am comas iad agus log a-steach leis an ainm-chleachdaiche 's am facal-faire agad an uairsin.",
"nocookieslogin": "Tha {{SITENAME}} a' cleachdadh briosgaidean gus daoine a logadh a-steach.\nChuir thu briosgaidean à comas.\nCuir an comas iad is feuch ris a-rithist.",
"nocookiesfornew": "Cha deach an cunntas a chruthachadh oir cha b' urrainn dhuinn a thùs a dhearbhadh.\nDèan cinnteach gu bheil briosgaidean an comas, ath-luchdaich an duilleag seo 's feuch ris a-rithist.",
+ "nocookiesforlogin": "{{int:nocookieslogin}}",
"noname": "Cha do thagh thu ainm-cleachdaiche dligheach.",
"loginsuccesstitle": "Rinn thu logadh a-steach",
- "loginsuccess": "'''Rinn thu logadh a-steach air {{SITENAME}} mar \"$1\".'''",
+ "loginsuccess": "<strong>Rinn thu logadh a-steach air {{SITENAME}} mar \"$1\".</strong>",
"nosuchuser": "Chan eil cleachdaiche ann air a bheil \"$1\".\nTha ainmean chleachdaichean mothaichail do litrichean mòra 's beaga.\nThoir sùil air an litreachadh no [[Special:UserLogin/signup|cruthaich cunntas ùr]].",
"nosuchusershort": "Chan eil cleachdaiche ann leis an ainm \"$1\".\nCuir sùil air an litreachadh.",
"nouserspecified": "Tha agad ri ainm-cleachdaiche a chur ann.",
"passwordsent": "Chaidh facal-faire ùr a chur dhan phost-d a chaidh a chlàradh airson \"$1\".\nClàraich a-steach a-rithist nuair a gheibh thu e.",
"blocked-mailpassword": "Chaidh bacadh a chur air an t-seòladh IP agad 's chan eil cead deasachaidh agad agus chan urrainn dhut an gleus a chum aiseag an fhacail-fhaire a chleachdadh gus casg a chur air mì-ghnàthachadh.",
"eauthentsent": "Chaidh post-d dearbhaidh a chur dhan phost-d a chaidh ainmeachadh.\nMus dèid post-d sam bith eile a chur dhan chunntas, feumaidh tu leantainn ris an stiùireadh sa phost-d mar dhearbhadh gur ann agadsa a tha an cunntas.",
- "throttled-mailpassword": "Chaidh post-d a chur airson ath-shuidheachadh facail-fhaire mu thràth {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair}} a thìde air ais.\nGus casg a chur air mì-ghnàthachadh, cha chuir sinn ach aon chuimhneachan facail-fhaire gach {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair}} a thìde.",
+ "throttled-mailpassword": "Chaidh post-d a chur airson ath-shuidheachadh facail-fhaire mu thràth $1 {{PLURAL:$1|uair|uair|uairean|uair}} a thìde air ais.\nGus casg a chur air mì-ghnàthachadh, cha chuir sinn ach aon chuimhneachan facail-fhaire gach $1 {{PLURAL:$1|uair|uair|uairean|uair}} a thìde.",
"mailerror": "Mearachd a' cur post: $1",
- "acct_creation_throttle_hit": "Chruthaich na h-aoighean air an Uici seo {{PLURAL:$1|1 chunntas|$1 chunntas|$1 cunntasan|$1 cunntas}} fon IP agad an-dè agus sin an àireamh as motha a tha ceadaichte. Chan urrainn do dh'aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin.",
+ "acct_creation_throttle_hit": "Chruthaich na h-aoighean air an uicidh seo {{PLURAL:$1|$1 chunntas|$1 chunntas|$1 cunntasan|$1 cunntas}} fon IP agad an-dè agus sin an àireamh as motha a tha ceadaichte. Chan urrainn do dh'aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin.",
"emailauthenticated": "Chaidh an seòladh puist-d agad a dhearbhadh $2 aig $3.",
"emailnotauthenticated": "Cha deach am post-d agad a dhearbhadh fhathast.\nCha dèid post-d a chur airson gin dhe na feartan a leanas.",
"noemailprefs": "Sònraich post-d sna roghainnean agad gus na feartan seo a chur an comas.",
"cannotchangeemail": "Cha ghabh na puist-d a tha co-cheangailte ri cunntas atharrachadh air an uicipeid seo.",
"emaildisabled": "Chan urrainn dhut puist-d a chur air an làrach seo.",
"accountcreated": "Cunntas cruthaichte",
- "accountcreatedtext": "Chaidh an cunntas cleachdaiche airson [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) a chruthachadh.",
+ "accountcreatedtext": "Chaidh an cunntas cleachdaiche airson [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|na deasbaireachd]]) a chruthachadh.",
"createaccount-title": "Cruthachadh cunntais airson {{SITENAME}}",
"createaccount-text": "Chruthaich cuideigin cunntas airson a' phost-d agad air {{SITENAME}} ($4) air a bheil \"$2\", leis an fhacal-fhaire \"$3\".\nBu chòir dhut clàradh a-steach agus am facal-faire agad atharrachadh gu h-ìosal an-dràsta.\n\n'S urrainn dhut an teachdaireachd seo a leigeil seachad ma chaidh an cunntas a chruthachadh air mhearachd.",
"login-throttled": "Dh'fheuch thu ri clàradh a-steach ro thric o chionn ghoirid.\nFuirich ort $1 mus feuch thu ris a-rithist.",
"user-mail-no-body": "Bha bodhaig na teachdaireachd bàn no air leth goirid.",
"changepassword": "Atharraich facal-faire",
"resetpass_announce": "Gus an clàradh a-steach a choileanadh, tha agad ri facal-faire ùr a shuidheachadh.",
+ "resetpass_text": "<!-- Cuir teacsa an-seo -->",
"resetpass_header": "Atharraich facal-faire a' chunntais",
"oldpassword": "Seann fhacal-faire",
"newpassword": "Facal-faire ùr",
"resetpass-validity-soft": "Chan eil am facal-faire seo dligheach: $1\n\nTagh facal-faire ùr an-dràsta no briog air \"{{int:resetpass-submit-cancel}}\" gus ath-shuidheachadh às a dhèidh seo.",
"passwordreset": "Ath-shuidhich am facal-faire",
"passwordreset-text-one": "Lìon am foirm seo gus am facal-faire agad ath-shuidheachadh.",
- "passwordreset-text-many": "{{PLURAL:$1|Lìon aon dhe na raointean gus facal-faire sealach fhaighinn ann am post-d.}}",
+ "passwordreset-text-many": "Lìon {{PLURAL:$1|an raon|aon dhe na raointean}} gus facal-faire sealach fhaighinn air a' phost-d.",
"passwordreset-legend": "Ath-shuidhich am facal-faire",
- "passwordreset-disabled": "Chaidh ath-shuidheachadh nam faclan-faire a chur à comas air an uicipeid seo.",
- "passwordreset-emaildisabled": "Chaidh feartan a' phuist-d a chur à comas san uicipeid seo.",
+ "passwordreset-disabled": "Chaidh ath-shuidheachadh nam faclan-faire a chur à comas air an uicidh seo.",
+ "passwordreset-emaildisabled": "Chaidh feartan a' phuist-d a chur à comas san uicidh seo.",
"passwordreset-username": "Ainm-cleachdaiche:",
"passwordreset-domain": "Àrainn-lìn:",
"passwordreset-capture": "A bheil thu airson coimhead air a' phost-d?",
"passwordreset-capture-help": "Ma chuireas tu cromag sa bhogsa seo, chì thusa am post-d (leis an fhacal-fhaire sealach) agus gheibh an cleachdaiche e cuideachd.",
"passwordreset-email": "Seòladh puist-d:",
"passwordreset-emailtitle": "Dàta a' chunntais air {{SITENAME}}",
- "passwordreset-emailtext-ip": "Dh'iarr cuideigin (thu fhèin, 's mathaid, on t-seòladh IP $1) am facal-faire airson {{SITENAME}} ($4) ath-shuidheachadh. Tha {{PLURAL:$3|an cunntas|an dà chunntas|na $3 cunntasan|na $3 cunntas}} a leanas co-cheangailte ris a' phost-d seo:\n\n$2\n\nFalbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an $3 fhacal-faire|na $3 faclan-faire|na $3 facal-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 làithean|$5 latha}}.\nBu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
- "passwordreset-emailtext-user": "Dh'iarr an cleachdaiche $1 air {{SITENAME}} ath-shuidheachadh an fhacail-fhaire air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|an $3 chunntas-cleachdaiche|na $3 cunntasan-cleachdaiche|na $3 cunntas-cleachdaiche}} a leanas co-cheangailte ris a' phost-d seo:\n\n$2\n\nFalbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an $3 fhacal-faire|na $3 faclan-faire|na $3 facal-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 làithean|$5 latha}}.\nBu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
+ "passwordreset-emailtext-ip": "Dh'iarr cuideigin (thu fhèin, 's mathaid, on t-seòladh IP $1) am facal-faire airson {{SITENAME}} ($4) ath-shuidheachadh. Tha {{PLURAL:$3|an cunntas|na cunntasan}} a leanas co-cheangailte ris a' phost-d seo:\n\n$2\n\nFalbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire shealach|na faclan-faire sealach}} seo an ceann $5 {{PLURAL:$5|latha|latha|làithean|latha}}.\nBu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
+ "passwordreset-emailtext-user": "Dh'iarr an cleachdaiche $1 air {{SITENAME}} ath-shuidheachadh an fhacail-fhaire air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|na cunntasan-cleachdaiche}} a leanas co-cheangailte ris an t-seòladh puist-d seo:\n\n$2\n\nFalbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire shealach|na faclan-faire sealach}} seo an ceann $5 {{PLURAL:$5|latha|latha|làithean|latha}}.\nBu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
"passwordreset-emailelement": "Ainm-cleachdaiche: $1\nFacal-faire sealach: $2",
"passwordreset-emailsent": "Chaidh post-d airson ath-shuidheachadh an fhacail-fhaire a chur.",
"passwordreset-emailsent-capture": "Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a chur agus chì thu sin gu h-ìosal.",
- "passwordreset-emailerror-capture": "Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a ghintinn agus chì thu sin gu h-ìosal ach cha b' urrainn dhuinn a chur dhan chleachdaiche {{GENDER:$2|user}}: $1",
+ "passwordreset-emailerror-capture": "Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a ghintinn agus chì thu sin gu h-ìosal ach cha b' urrainn dhuinn a chur dhan chleachdaiche: $1",
"changeemail": "Atharraich am post-d",
"changeemail-header": "Atharraich cunntas a' phuist-d",
"changeemail-text": "Lìon am foirm seo gus am post-d agad atharrachadh. Feumaidh tu am facal-faire agad a chur a-steach a-rithist gus a dhearbhadh.",
"headline_sample": "Teacsa ceann-loidhne",
"headline_tip": "Ceann-loidhne ìre 2",
"nowiki_sample": "Cuir a-steach teacsa gun fhòrmatadh an-seo",
- "nowiki_tip": "Leig seachad fòrmatadh uici",
+ "nowiki_tip": "Leig seachad fòrmatadh uicidh",
"image_sample": "Eisimpleir.jpg",
"image_tip": "Faidhle air a leabachadh",
"media_sample": "Eisimpleir.ogg",
"preview": "Ro-shealladh",
"showpreview": "Seall an ro-shealladh",
"showdiff": "Seall na mùthaidhean",
- "anoneditwarning": "'''Rabhadh:''' Chan eil thu air logadh a-steach.\nThèid an seòladh IP agad a chlàrachadh ann an eachdraidh na duilleige seo.",
- "anonpreviewwarning": "''Chan eil thu air clàradh a-steach. Ma nì thu sàbhaladh, thèid an seòladh IP agad a chlàradh ann an eachdraidh deasachadh na duilleige seo.''",
- "missingsummary": "'''Cuimhnich:''' Cha dug thu seachad gearr-chunntas air na dh'atharraich thu.\nMa bhriogas tu air \"{{int:savearticle}}\" a-rithist, thèid na dheasaich thu a shàbhaladh as aonais gearr-chunntais.",
+ "anoneditwarning": "<strong>Rabhadh:</strong> Chan eil thu air logadh a-steach.\nThèid an seòladh IP agad a chlàrachadh ann an eachdraidh na duilleige seo.",
+ "anonpreviewwarning": "<em>Chan eil thu air clàradh a-steach. Ma nì thu sàbhaladh, thèid an seòladh IP agad a chlàradh ann an eachdraidh deasachadh na duilleige seo.</em>",
+ "missingsummary": "<strong>Cuimhnich:</strong> Cha dug thu seachad gearr-chunntas air na dh'atharraich thu.\nMa bhriogas tu air \"{{int:savearticle}}\" a-rithist, thèid na dheasaich thu a shàbhaladh as aonais gearr-chunntais.",
"missingcommenttext": "Cuir a-steach beachd gu h-ìosal.",
- "missingcommentheader": "'''Cuimhnich:''' Cha dug thu seachad cuspair/ceann airson a' bheachd seo.\nMa bhriogas tu air \"{{int:savearticle}}\" a-rithist, thèid na dheasaich thu a shàbhaladh as aonais.",
+ "missingcommentheader": "<strong>Cuimhnich:</strong> Cha dug thu seachad cuspair/ceann airson a' bheachd seo.\nMa bhriogas tu air \"{{int:savearticle}}\" a-rithist, thèid na dheasaich thu a shàbhaladh as aonais.",
"summary-preview": "Ro-shealladh a' ghearr-chunntais:",
"subject-preview": "Ro-shealladh air a' chuspair/air a' cheann:",
"blockedtitle": "Tha an cleachdair air a bhacadh",
- "blockedtext": "''Chaidh an t-ainm-cleachdaiche no an seòladh IP agad a bhacadh.'''\n\n'S e $1 a chur am bacadh seo ort.\nThug iad an cèill gun do rinn iad sinn air sgàth an adhbhair seo: ''$2''.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\nChan urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
- "autoblockedtext": "''Chaidh an seòladh IP agad a bhacadh gu fèin-obrachail a chionn 's gun deach a chleachdadh le cuideigin eile a chaidh a bhacadh le $1.'''\nThug iad an cèill gun do rinn iad sinn air sgàth an adhbhair seo: \n\n:''$2''.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\n\nDh'fhaoidte nach urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
+ "blockedtext": "<strong>Chaidh an t-ainm-cleachdaiche no an seòladh IP agad a bhacadh.</strong>\n\n'S e $1 a chur am bacadh seo ort.\n{{GENDER:$1|Thug e|Thug i|Thugadh}} an cèill gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} sin air sgàth an adhbhair seo: <em>$2</em>.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\nChan urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
+ "autoblockedtext": "Chaidh an seòladh IP agad a bhacadh gu fèin-obrachail a chionn 's gun deach a chleachdadh le cuideigin eile a chaidh a bhacadh le $1.\n{{GENDER:$1|Thug e|Thug i|Thugadh}} an cèill gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} sin air sgàth an adhbhair seo: \n\n:<em>$2</em>.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\n\nDh'fhaoidte nach urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
"blockednoreason": "cha deach adhbhar a shònrachadh",
"whitelistedittext": "Feumaidh tu $1 mus urrainn dhut duilleagan a dheasachadh.",
"confirmedittext": "Feumaidh tu am post-d agad a dhearbhadh mus urrainn dhut duilleagan a dheasachadh.\nSuidhich is dearbhaich am post-d agad ann an [[Special:Preferences|roghainnean a' chleachdaiche]]",
"loginreqlink": "log a-steach",
"loginreqpagetext": "Feumaidh tu $1 mus urrainn dhut coimhead air duilleagan eile.",
"accmailtitle": "Facal-faire air a chur.",
- "accmailtext": "Chaidh facal-faire a chruthachadh air thuaiream airson [[User talk:$1|$1]] 's a chur gu $2.\n\nGabhaidh am facal-faire airson a' chunntais ùir seo atharrachadh air an fo ''[[Special:ChangePassword|atharraich facal-faire]]'' as dèidh dhan chleachdaiche clàradh a-steach.",
+ "accmailtext": "Chaidh facal-faire a chruthachadh air thuaiream airson [[User talk:$1|$1]] 's a chur gu $2.\n\nGabhaidh am facal-faire airson a' chunntais ùir seo atharrachadh air an fo <em>[[Special:ChangePassword|atharraich facal-faire]]</em> às dèidh dhan chleachdaiche clàradh a-steach.",
"newarticle": "(Ùr)",
- "newarticletext": "Lean thu ri ceangal gu duilleag nach eil ann fhathast.\nCuir teacs sa bhogsa gu h-ìosal gus an duilleag seo a chruthachadh (seall air [$1 duilleag na cobharach] airson barrachd fiosrachaidh).\nMura robh dùil agad ris an duilleag seo a ruigsinn, briog air a' phutan '''air ais''' 'nad bhrabhsair.",
- "anontalkpagetext": "----''Seo an duilleag deasbaireachd aig cleachdaiche gun urra nach do chruthaich cunntas fhathast no nach eil 'ga chleachdadh.\nFeumaidh sinn an àireamh IP aca a chleachdadh air sgàth sin.\nFaodadh grunn chleachdaichean seòladh IP mar a chleachdadh còmhla.\nMas e cleachdaiche gun urra a tha annad 's ma tha thu dhen bheachd nach eil na beachdan seo a' buntainn riut, nach [[Special:UserLogin/signup|clàraich thu]] no [[Special:UserLogin|clàraich a-steach]] gus bùrach mar seo a sheachnadh san àm ri teachd?''",
+ "newarticletext": "Lean thu ri ceangal gu duilleag nach eil ann fhathast.\nCuir teacs sa bhogsa gu h-ìosal gus an duilleag seo a chruthachadh (seall air [$1 duilleag na cobharach] airson barrachd fiosrachaidh).\nMura robh dùil agad ris an duilleag seo a ruigsinn, briog air a' phutan <strong>air ais</strong> 'nad bhrabhsair.",
+ "anontalkpagetext": "----\n<em>Seo an duilleag deasbaireachd aig cleachdaiche gun urra nach do chruthaich cunntas fhathast no nach eil 'ga chleachdadh.</em>\nFeumaidh sinn an àireamh IP aca a chleachdadh air sgàth sin.\nFaodadh grunn chleachdaichean seòladh IP mar a chleachdadh còmhla.\nMas e cleachdaiche gun urra a tha annad 's ma tha thu dhen bheachd nach eil na beachdan seo a' buntainn riut, nach [[Special:UserLogin/signup|clàraich thu]] no [[Special:UserLogin|clàraich a-steach]] gus bùrach mar seo a sheachnadh san àm ri teachd?",
"noarticletext": "Chan eil teacsa sam bith anns an duilleag seo an-dràsta.\n'S urrainn dhut [[Special:Search/{{PAGENAME}}|an tiotal seo a lorg]] ann an duilleagan eile,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} na logaichean co-cheangailte a rannsachadh],\nno [{{fullurl:{{FULLPAGENAME}}|action=edit}} an duilleag seo a dheasachadh]</span>.",
"noarticletext-nopermission": "Chan eil teacsa sam bith san duilleag seo an-dràsta.\n'S urrainn dhut [[Special:Search/{{PAGENAME}}|tiotal na duilleige seo a lorg]] ann an duilleagan eile, no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} na logaichean co-cheangailte a rannsachadh]</span> ach chan eil cead agad an duilleag seo a chruthachadh.",
"missing-revision": "Chan eil mùthadh #$1 na duilleige \"{{FULLPAGENAME}}\" ann.\n\nMar is trice, tachraidh seo ma leanas tu ceangal san eachdraidh a tha fìor aosta 's a tha a' dol gu duilleag a chaidh a sguabadh às.\nGheibh thu mion-fhiosrachadh ann an [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} loga nan duilleagan a chaidh a sguabadh às].",
"userpage-userdoesnotexist": "Chan e cunntas clàraichte a tha ann an \"$1\".\nDèan cinnteach gu bheil thu airson an duilleag seo a chruthachadh/dheasachadh.",
"userpage-userdoesnotexist-view": "Cha deach an cunntas cleachdaiche \"$1\" a chlàradh.",
"blocked-notice-logextract": "Tha an cleachdaiche seo air a bhacadh an-dràsta fhèin.\nChì thu loga a' bhacaidh mu dheireadh gu h-ìosal mar fhiosrachadh dhut:",
- "clearyourcache": "'''An aire:''' As dèidh dhut sàbhaladh, 's mathaid gum bi agad tasgadan a' bhrabhsair agad a chur air gleus mus fhaic thu na dh'atharraich thu.\n* '''Firefox / Safari:''' Cum 'shìos 'Shift'' is briog air ''Ath-luchdaich' no brùth ''Ctrl-F5'' no ''Ctrl-R'' (''⌘-R'' air Mac)\n* '''Google Chrome:''' Brùth ''Ctrl-Shift-R'' (''⌘-Shift-R'' air Mac)\n* '''Internet Explorer:''' Cum shìos ''Ctrl'' is briog air ''Ath-nuadhaich'' no brùth ''Ctrl-F5''\n* '''Opera:''' Falamhaich an tasgadan ann an ''Innealan → Roghainnean''",
- "usercssyoucanpreview": "'''Gliocas:''' Cleachd am putan \"{{int:showpreview}}\" airson an CSS agad a chur fo dheuchainn mus sàbhail thu e.",
- "userjsyoucanpreview": "'''Gliocas:''' Cleachd am putan \"{{int:showpreview}}\" gus an JavaScript ùr agad a chur fo dheuchainn mus sàbhail thu e.",
- "usercsspreview": "'''Cuimhnich nach e seo ach ro-shealladh air a' CSS chleachdaiche agad.'''\n'''Cha deach a shàbhaladh fhathast!''''",
- "userjspreview": "'''Cuimhnich nach e seo ach ro-shealladh/deuchainn air a' JavaScript agad.'''\n'''Cha deach a shàbhaladh fhathast!''''",
- "sitecsspreview": "'''Cuimhnich nach e seo ach ro-shealladh air a' CSS agad.'''\n'''Cha deach a shàbhaladh fhathast!''''",
- "sitejspreview": "'''Cuimhnich nach e seo ach ro-shealladh air còd a' JavaScript agad.'''\n'''Cha deach a shàbhaladh fhathast!''''",
- "userinvalidcssjstitle": "'''Rabhadh:''' Chan eil an craiceann \"$1\" ann.\nCleachdaidh duilleagan gnàthaichte .css agus .js tiotal ann an litrichean beaga, m.e. {{ns:user}}:Foo/vector.css seach {{ns:user}}:Foo/Vector.css.",
+ "clearyourcache": "<strong>An aire:</strong> As dèidh dhut sàbhaladh, 's mathaid gum bi agad tasgadan a' bhrabhsair agad a chur air gleus mus fhaic thu na dh'atharraich thu.\n* <strong>Firefox / Safari:</strong> Cum shìos <em>Shift</em> is briog air <em>Ath-luchdaich</em> no brùth <em>Ctrl-F5</em> no <em>Ctrl-R</em> (<em>⌘-R</em> air Mac)\n* <strong>Google Chrome:</strong> Brùth <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> air Mac)\n* <strong>Internet Explorer:</strong> Cum shìos <em>Ctrl</em> is briog air <em>Ath-nuadhaich</em> no brùth <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Falamhaich an tasgadan ann an <em>Innealan → Roghainnean</em>",
+ "usercssyoucanpreview": "<strong>Gliocas:</strong> Cleachd am putan \"{{int:showpreview}}\" airson an CSS agad a chur fo dheuchainn mus sàbhail thu e.",
+ "userjsyoucanpreview": "<strong>Gliocas:</strong> Cleachd am putan \"{{int:showpreview}}\" gus an JavaScript ùr agad a chur fo dheuchainn mus sàbhail thu e.",
+ "usercsspreview": "<strong>Cuimhnich nach e seo ach ro-shealladh air a' CSS chleachdaiche agad.\nCha deach a shàbhaladh fhathast!</strong>",
+ "userjspreview": "<strong>Cuimhnich nach e seo ach ro-shealladh/deuchainn air a' JavaScript agad.\nCha deach a shàbhaladh fhathast!</strong>",
+ "sitecsspreview": "<strong>Cuimhnich nach e seo ach ro-shealladh air a' CSS agad.\nCha deach a shàbhaladh fhathast!</strong>",
+ "sitejspreview": "<strong>Cuimhnich nach e seo ach ro-shealladh air còd a' JavaScript agad.\nCha deach a shàbhaladh fhathast!</strong>",
+ "userinvalidcssjstitle": "<strong>Rabhadh:</strong> Chan eil an craiceann \"$1\" ann.\nCleachdaidh duilleagan gnàthaichte .css agus .js tiotal ann an litrichean beaga, m.e. {{ns:user}}:Foo/vector.css seach {{ns:user}}:Foo/Vector.css.",
"updated": "(Air ùrachadh)",
- "note": "'''An aire:'''",
- "previewnote": "'''Cuimhnich nach eil ann ach ro-shealladh.'''\nCha deach na mùthaidhean agad a shàbhaladh fhathast!",
+ "note": "<strong>An aire:</strong>",
+ "previewnote": "<strong>Cuimhnich nach eil ann ach ro-shealladh.</strong>\nCha deach na mùthaidhean agad a shàbhaladh fhathast!",
"continue-editing": "Rach gun raon deasachaidh",
"previewconflict": "Tha an ro-shealladh seo a' sealltainn dhut an teacsa san raon teacsa gu h-àrd mar a nochdas e ma shàbhaileas tu an-dràsta.",
- "session_fail_preview": "'''Duilich! Cha b' urrainn dhuinn na dheasaich thu a làimhseachadh air sgàth call dàta an t-seisein.'''\nNach fheuch thu ris a-rithist?\nMur obraich e fhathast, feuch is [[Special:UserLogout|clàraich a-mach]] is a-steach a-rithist an uairsin.",
- "session_fail_preview_html": "'''Duilich! Cha b' urrainn dhuinn na dheasaich thu a làimhseachadh air sgàth call dàta an t-seisein.'''\n\n''A chionn 's gun do chuir {{SITENAME}} HTML amh an comas, tha an ro-shealladh falaichte mar dhìon an aghaidh ionnsaighean JavaScript.''\n\n'''Mas e deasachadh dligheach a tha seo, feuch ris a-rithist.'''\nMur obraich e fhathast, feuch is [[Special:UserLogout|clàraich a-mach]] is a-steach a-rithist an uairsin.",
- "token_suffix_mismatch": "'''Dhiùlt sinn na dheasaich thu a chionn 's gun do chuir an cliant agad na caractaran puingeachaidh tro chèile san tòcan deasachaidh.'''\nDhiùlt sinn na dheasaich thu air eagal 's gun coirbeadh e teacsa na duilleige.\nTachraidh seo uaireannan ma chleachdar seirbheis-lìn progsaidh gun urra a tha làn de mhearachdan.",
- "edit_form_incomplete": "'''Cha do ràinig cuid dhen fhoirm deasachaidh am frithealaichte; dèan cinnteach gu bheil gach deasachadh agad slàn is feuch ris a-rithist.'''",
+ "session_fail_preview": "<strong>Duilich! Cha b' urrainn dhuinn na dheasaich thu a làimhseachadh air sgàth call dàta an t-seisein.</strong>\nNach fheuch thu ris a-rithist?\nMur obraich e fhathast, feuch is [[Special:UserLogout|clàraich a-mach]] is a-steach a-rithist an uairsin.",
+ "session_fail_preview_html": "<strong>Duilich! Cha b' urrainn dhuinn na dheasaich thu a làimhseachadh air sgàth call dàta an t-seisein.</strong>\n\n<em>A chionn 's gun do chuir {{SITENAME}} còd HTML an comas, tha an ro-shealladh falaichte mar dhìon an aghaidh ionnsaighean JavaScript.</em>\n\n<strong>Mas e deasachadh dligheach a tha seo, feuch ris a-rithist.</strong>\nMur obraich e fhathast, feuch is [[Special:UserLogout|clàraich a-mach]] is a-steach a-rithist an uairsin.",
+ "token_suffix_mismatch": "<strong>Dhiùlt sinn na dheasaich thu a chionn 's gun do chuir an cliant agad na caractaran puingeachaidh tro chèile san tòcan deasachaidh.</strong>\nDhiùlt sinn na dheasaich thu air eagal 's gun coirbeadh e teacsa na duilleige.\nTachraidh seo uaireannan ma chleachdar seirbheis-lìn progsaidh gun urra a tha làn de mhearachdan.",
+ "edit_form_incomplete": "<strong>Cha do ràinig cuid dhen fhoirm deasachaidh am frithealaichte; dèan cinnteach gu bheil gach deasachadh agad slàn is feuch ris a-rithist.</strong>",
"editing": "A' deasachadh $1",
"creating": "A' cruthachadh $1",
"editingsection": "A' deasachadh $1 (earrann)",
"editingcomment": "A' deasachadh $1 (earrann ùr)",
"editconflict": "Còmhstri deasachaidh: $1",
- "explainconflict": "Tha cuideigin eile air an duilleag seo a mhùthadh on a thòisich thu fhèin air a dheasachadh.\nTha am bogsa teacsa gu h-àrd a' nochdadh na duilleige mar a tha i an-dràsta.\nTha na mùthaidhean agadsa sa bhogsa gu h-ìosal.\nBidh agad ris na mùthaidhean agad fhilleadh a-steach san teacsa làithreach.\nCha dèid '''ach an teacsa gu h-àrd''' a shàbhaladh nuair a bhriogas tu air \"{{int:savearticle}}\".",
+ "explainconflict": "Tha cuideigin eile air an duilleag seo a mhùthadh on a thòisich thu fhèin air a dheasachadh.\nTha am bogsa teacsa gu h-àrd a' nochdadh na duilleige mar a tha i an-dràsta.\nTha na mùthaidhean agadsa sa bhogsa gu h-ìosal.\nBidh agad ris na mùthaidhean agad a cho-aonachadh ris an teacsa làithreach.\nCha dèid <strong>ach an teacsa gu h-àrd</strong> a shàbhaladh nuair a bhriogas tu air \"{{int:savearticle}}\".",
"yourtext": "An teacsa agad",
- "storedversion": "Lethbhreac taisgte",
- "nonunicodebrowser": "'''Rabhadh: Chan eil am brabhsair agad co-chòrdail le Unicode.'''\nChuir sinn gleus air dòigh dhut a nì cinnteach gun urrainn dhut duilleagan a shàbhaladh gu tèarainte: Nochdaidh caractaran taobh a-muigh ASCII mar chòd sia-dheicheach sa bhogsa deasachaidh.",
- "editingold": "'''RABHADH: Tha thu a' deasachadh lethbhreac seann-aimsireil na duilleige seo.\nMa shàbhalas tu seo, thèid gach mùthadh air chall a rinneadh a-mach on mhùthadh seo.'''",
- "yourdiff": "Caochlaidhean",
- "copyrightwarning": "Thoir an aire gu bheilear a' tuigsinn gu bheil gach rud a chuireas tu ri {{SITENAME}} air a leigeil mu sgaoil fo $2 (see $1 airson mion-fhiosrachadh).\nMura bi thu toilichte 's daoine eile a' deasachadh gun tròcair na sgrìobh tu 's 'ga sgaoileadh mar a thogras iad, na cuir an-seo e.<br />\nTha thu a' toirt geall cuideachd gun do sgrìobh thu fhèin seo no gun do rinn thu lethbhreac dheth o àrainn phoblach no tùs saor coltach ris.\n'''Na cuir ann rudan fo chòir lethbhric gun chead!'''",
- "copyrightwarning2": "Ged a thatar gur moladh {{SITENAME}} a chruthachadh, a mheudachadh, is a leasachadh, thèid droch dheasaicheidhean a chur air imrich gu luath.\nMur eil thu ag iarraidh an sgrìobhaidh agad a dheasaichear is a sgaoilear le càch, na cuir e.<br />\nMa dh'fhoilleachas tu rudeigin an seo, bidh tu a' dearbhadh gun do sgrìobh thu fhèin e, no gur ann às an raon phòballach a thàinig e; thoir aire '''nach eil''' sin a' gabhail a-staigh duilleagan-lìn mar as àbhaist (seall $1 airson barrachd fiosrachaidh). <br />\n'''NA CLEACHDAIBH SAOTHAIR FO DHLIGHE-SGRÌOBHAIDH GUN CHEAD!'''",
- "longpageerror": "Mearachd: Tha an teacsa a chur thu thugainn {{PLURAL:$1 kilobyte|$1 kilobytes}} a dh'fhaid is tha sin nas fhaide na tha ceadaichte ({{PLURAL:$2 kilobyte|$2 kilobytes}}).'''\nCha ghabh a shàbhaladh.",
- "readonlywarning": "'''Rabhadh: Chaidh an stòr-dàta a ghlasadh a chum obair-ghlèidhidh agus chan urrainn dhut na dheasaich thu a shàbhaladh an-dràsta fhèin.'''\n'S mathaid gum b' fheairrde dhut lethbhreac a dhèanamh dhen teacsa agus a shàbhaladh ann am faidhle ach an urrainn dhut a chleachdadh as a dhèidh seo.\n\nSeo am mìneachadh a thug an rianaire a ghlais e: $1",
- "protectedpagewarning": "'''Rabhadh: Chaidh an duilleag seo a dhìon 's chan urrainn ach dhan fheadhainn aig a bheil ùghdarras rianaire a dheasachadh.'''\nChì thu an clàr mu dheireadh san loga mar fhiosrachadh dhut gu h-ìosal:",
- "semiprotectedpagewarning": "'''An aire:''' Chaidh an duilleag seo a dhìon 's chan fhaod ach cleachdaichean clàraichte a dheasachadh.\nSeo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
- "cascadeprotectedwarning": "'''Rabhadh:''' Chaidh an duilleag seo a dhìon 's chan fhaod ach rianairean a dheasachadh a chionn 's gun robh e am broinn {{PLURAL:$1|na duilleige|nan duilleagan}} a leanas a tha cascade-protected.",
- "titleprotectedwarning": "'''Rabhadh: Chaidh an duilleag seo a dhìon 's feumar [[Special:ListGroupRights|còraichean sònraichte]] gus a dheasachadh.'''\nSeo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
- "templatesused": "Tha {{PLURAL:$1|teamplaid|theamplaid|teamplaidean|teamplaid}} 'gan cleachdadh air an duilleag seo:",
- "templatesusedpreview": "Tha {{PLURAL:$1|1 teamplaid 'ga cleachdadh|$1 theamplaid 'gan cleachdadh|$1 teamplaidean 'gan cleachdadh|$1 teamplaid 'gan cleachdadh}} san ro-shealladh seo:",
- "templatesusedsection": "Tha {{PLURAL:$1|$1 teamplaid 'ga cleachdadh|$1 theamplaid 'gan cleachdadh|$1 teamplaidean 'gan cleachdadh|$1 teamplaid 'gan cleachdadh}} san earrann seo:",
+ "storedversion": "Mùthadh taisgte",
+ "nonunicodebrowser": "<strong>Rabhadh: Chan eil am brabhsair agad co-chòrdail le Unicode.</strong>\nChuir sinn gleus air dòigh dhut a nì cinnteach gun urrainn dhut duilleagan a shàbhaladh gu tèarainte: Nochdaidh caractaran taobh a-muigh ASCII mar chòd sia-dheicheach sa bhogsa deasachaidh.",
+ "editingold": "<strong>RABHADH: Tha thu a' deasachadh seann-mhùthadh na duilleige seo.</strong>\nMa shàbhaileas tu seo, thèid gach atharrachadh air chall a rinneadh a-mach on mhùthadh seo.",
+ "yourdiff": "Diofaran",
+ "copyrightwarning": "Thoir an aire gu bheilear a' tuigsinn gu bheil gach obair a chuireas tu ri {{SITENAME}} air a leigeil mu sgaoil fo $2 (see $1 airson mion-fhiosrachadh).\nMura bi thu toilichte 's daoine eile a' deasachadh gun tròcair na sgrìobh tu 's 'ga sgaoileadh mar a thogras iad, na cuir an-seo e.<br />\nTha thu a' toirt geall cuideachd gun do sgrìobh thu fhèin seo no gun do rinn thu lethbhreac dheth o àrainn phoblach no tùs saor coltach ris.\n<strong>Na cuir ann rudan fo chòir-lethbhreac gun chead!</strong>",
+ "copyrightwarning2": "Thoir an aire gum faod deasaichean eile gach obair a chuireas tu ri {{SITENAME}} a dheasachadh, atharrachadh no a thoirt air falbh.\nMur eil thu ag iarraidh gun deasaich cuideigin eile na sgrìobh thu gun truas, na cuir a-null e.<br />\nNì thu gealladh dhuinn cuideachd gur e thu fhèin a sgrìobh e no gun do rinn thu lethbhreac dheth o Public Domain no stòras saor dhen leithid (faic $1 airson barrachd fiosrachaidh). <br />\n<strong>Na cuir a-null obair a tha fo chòir-lethbhreac gun chead!</strong>",
+ "longpageerror": "<strong>Mearachd: Tha an teacsa a chur thu thugainn $1 {{PLURAL:$1|chileabaidht|chileabaidht|cileabaidhtichean|cileabaidht}} a dh'fhaid is tha sin nas fhaide na tha ceadaichte ($2 {{PLURAL:$2|chileabaidht|chileabaidht|cileabaidhtichean|cileabaidht}}).</strong>\nCha ghabh a shàbhaladh.",
+ "readonlywarning": "<strong>Rabhadh: Chaidh an stòr-dàta a ghlasadh a chum obair-ghlèidhidh agus chan urrainn dhut na dheasaich thu a shàbhaladh an-dràsta fhèin.</strong>\n'S mathaid gum b' fheairrde dhut lethbhreac a dhèanamh dhen teacsa agus a shàbhaladh ann am faidhle ach an urrainn dhut a chleachdadh as a dhèidh seo.\n\nSeo am mìneachadh a thug an rianaire a ghlais e: $1",
+ "protectedpagewarning": "<strong>Rabhadh: Chaidh an duilleag seo a dhìon 's chan urrainn ach dhan fheadhainn aig a bheil ùghdarras rianaire a dheasachadh.</strong>\nChì thu an clàr mu dheireadh san loga mar fhiosrachadh dhut gu h-ìosal:",
+ "semiprotectedpagewarning": "<strong>An aire:</strong> Chaidh an duilleag seo a dhìon 's chan fhaod ach cleachdaichean clàraichte a dheasachadh.\nSeo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
+ "cascadeprotectedwarning": "<strong>Rabhadh:</strong> Chaidh an duilleag seo a dhìon 's chan fhaod ach rianairean a dheasachadh a chionn 's gun robh e am broinn {{PLURAL:$1|na duilleige|nan duilleagan}} a leanas a tha dìonta o bhith mar eas.",
+ "titleprotectedwarning": "<strong>Rabhadh: Chaidh an duilleag seo a dhìon 's feumar [[Special:ListGroupRights|còraichean sònraichte]] gus a dheasachadh.</strong>\nSeo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
+ "templatesused": "Tha {{PLURAL:$1|teamplaid 'ga cleachdadh|teamplaidean 'gan cleachdadh}} air an duilleag seo:",
+ "templatesusedpreview": "Tha {{PLURAL:$1|teamplaid 'ga cleachdadh|teamplaidean 'gan cleachdadh}} san ro-shealladh seo:",
+ "templatesusedsection": "Tha {{PLURAL:$1|teamplaid 'ga cleachdadh|teamplaidean 'gan cleachdadh}} san earrann seo:",
"template-protected": "(air a dhìon)",
"template-semiprotected": "(air a leth-dhìon)",
- "hiddencategories": "Tha an duilleag seo 'na ball de {{PLURAL:$1|1 roinn-seòrsa fhalaichte|$1 roinn-seòrsa fhalaichte|$1 roinnean-seòrsa falaichte|$1 roinn-seòrsa fhalaichte}}:",
+ "hiddencategories": "Tha an duilleag seo 'na ball de {{PLURAL:$1|$1 roinn-seòrsa fhalaichte|$1 roinn-seòrsa fhalaichte|$1 roinnean-seòrsa falaichte|$1 roinn-seòrsa fhalaichte}}:",
+ "edittools": "<!-- Nochdaidh an teacsa seo fo fhoirmean deasachaidh 's luchdaidh suas. -->",
+ "edittools-upload": "-",
"nocreatetext": "Chuir {{SITENAME}} bacadh air cruthachadh de dhuilleagan ùra.\n'S urrainn dhut tilleadh is duilleag a tha ann mu thràth a dheasachadh no [[Special:UserLogin|clàradh a-steach no cunntas a chruthachadh]].",
"nocreate-loggedin": "Chan eil cead agad duilleagan ùra a chruthachadh.",
"sectioneditnotsupported-title": "Chan eil taic ri deasachadh earrannan",
"sectioneditnotsupported-text": "Chan eil taic ri deasachadh earrannan air an duilleag seo.",
"permissionserrors": "Mearachd leis a' chead",
- "permissionserrorstext": "Chan eil cead agad sin a dhèanamh air sgàth {{PLURAL:$1|an adhbhair|an $1 adhbhar|nan $1 adhbharan|nan $1 adhbhar}} a leanas:",
- "permissionserrorstext-withaction": "Chan eil cead agad airson \"$2\" air sgàth {{PLURAL:$1|an $1 adhbhair|an $1 adhbhar|nan $1 adhbharan|nan $1 adhbhar}} a leanas:",
- "recreate-moveddeleted-warn": "'''Rabhadh: Tha thu gu bhith ath-chruthachadh duilleag a chaidh a sguabadh às roimhe.'''\n\nSaoil am bu chòir dhut leantainn air adhart le deasachadh na duilleige?.\nSeo dhut loga an sguabaidh às agus a' ghluasaid mar fhiosrachadh dhut:",
+ "permissionserrorstext": "Chan eil cead agad sin a dhèanamh air sgàth {{PLURAL:$1|an adhbhair|nan adhbharan}} a leanas:",
+ "permissionserrorstext-withaction": "Chan eil cead agad airson \"$2\" air sgàth {{PLURAL:$1|an adhbhair|nan adhbharan}} a leanas:",
+ "recreate-moveddeleted-warn": "<strong>Rabhadh: Tha thu gu bhith ath-chruthachadh duilleag a chaidh a sguabadh às roimhe.</strong>\n\nSaoil am bu chòir dhut leantainn air adhart le deasachadh na duilleige?.\nSeo dhut loga an sguabaidh às agus a' ghluasaid mar fhiosrachadh dhut:",
"moveddeleted-notice": "Chaidh an duilleag seo a sguabadh às.\nChì thu loga an sguabaidh às agus a' ghluasaid gu h-ìosal mar fhiosrachadh dhut.",
"log-fulllog": "Seall an loga slàn",
"edit-hook-aborted": "Sguireadh dhen deasachadh ri linn dubhan.\nCha deach adhbhar a thoirt seachad.",
"content-model-text": "teacsa lom",
"content-model-javascript": "JavaScript",
"content-model-css": "CSS",
- "expensive-parserfunction-warning": "'''Rabhadh:''' Tha cus expensive parser function calls san duilleag seo.\n\nBu chòir nas lugha na $2 {{PLURAL:$2|call|calls}} a bhith ann ach tha {{PLURAL:$1|$1 call|$1 calls}} ann.",
+ "expensive-parserfunction-warning": "<strong>Rabhadh:</strong> Tha cus gairmean a' pharsair cosgail san duilleag seo.\n\nBu chòir nas lugha na $2 {{PLURAL:$2|ghairm|ghairm|gairmean|gairm}} a bhith ann ach tha $1 {{PLURAL:$1|ghairm|ghairm|gairmean|gairm}} ann.",
"expensive-parserfunction-category": "Duilleagan le cus expensive parser function calls",
- "post-expand-template-inclusion-warning": "'''Rabhadh:''' Tha meud na teamplaide ro mhòr.\nCha dèid cuid dhith a ghabhail a-steach.",
+ "post-expand-template-inclusion-warning": "<strong>Rabhadh:</strong> Tha meud na teamplaide ro mhòr.\nCha dèid cuid dhith a ghabhail a-steach.",
"post-expand-template-inclusion-category": "Duilleagan far a bheil meud nan teamplaidean a' dol thairis air na tha ceadaichte",
- "post-expand-template-argument-warning": "'''Rabhadh:''' Tha aon argamaid teamplaid air a' char as lugha air an duilleag seo aig a bheil meud leudachaidh ro mhòr.\nChaidh na h-argamaidean sinn a leigeil seachad.",
+ "post-expand-template-argument-warning": "<strong>Rabhadh:</strong> Tha aon argamaid teamplaid air a' char as lugha air an duilleag seo aig a bheil meud leudachaidh ro mhòr.\nChaidh na h-argamaidean sinn a leigeil seachad.",
"post-expand-template-argument-category": "Duilleagan air an deach argamaidean teamplaidean fhàgail às",
"parser-template-loop-warning": "Mhothaicheadh do lùb teamplaid: [[$1]]",
"parser-template-recursion-depth-warning": "Chaidh thu thairis air crìoch doimhne nan ath-chùrsaidhean teamplaid ($1)",
"undo-failure": "Cha b' urrainn dhuinn an deasachadh a neo-dhèanamh air sgàth 's gun robh deasachaidhean eile sa mheadhan.",
"undo-norev": "Cha b' urrainn dhuinn an deasachadh a neo-dhèanamh a chionn 's nach robh e ann no gun deach a sguabadh às.",
"undo-nochange": "Tha coltas gun deach am mùthadh seo a neo-dhèanamh mu thràth.",
- "undo-summary": "Neo-dhèan mùthadh $1 le [[Special:Contributions/$2|$2]] ([[User talk:$2|Deasbaireachd]])",
+ "undo-summary": "Neo-dhèan mùthadh $1 leis [[Special:Contributions/$2|$2]] ([[User talk:$2|an deasbaireachd]])",
"undo-summary-username-hidden": "Neo-dhèan am mùthadh $1 le cleachdaiche falaichte",
"cantcreateaccounttitle": "Cha ghabh an cunntas a chruthachadh",
- "cantcreateaccount-text": "Chuir [[User:$3|$3]] bacadh air cruthachadh chunntasan on t-seòladh IP seo ('''$1''').\n\nDh'innise $3 gun do rinn iad seo air sgàth: ''$2''",
- "cantcreateaccount-range-text": "Chuir [[User:$3|$3]] casg air daoine a tha airson cunntasan a chruthachadh on sheòlaidhean IP taobh a-staigh na rainse '''$1''' agus tha sin a' gabhail a-steach an t-seòlaidh IP agad-sa ('''$4''').\n\nThuir $3 gun do rinn iad seo air sgàth an adhbhair seo: ''$2''",
+ "cantcreateaccount-text": "Chuir [[User:$3|$3]] bacadh air cruthachadh chunntasan on t-seòladh IP seo (<strong>$1</strong>).\n\nDh'innis $3 gun do rinn {{GENDER:$3|e|i}} seo air sgàth: <em>$2</em>",
+ "cantcreateaccount-range-text": "Chuir [[User:$3|$3]] casg air daoine a tha airson cunntasan a chruthachadh on sheòlaidhean IP taobh a-staigh na rainse '''$1''' agus tha sin a' gabhail a-steach an t-seòlaidh IP agad-sa ('''$4''').\n\nDh'innis $3 gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} seo air sgàth an adhbhair seo: ''$2''",
"viewpagelogs": "Seall logaichean na duilleige seo",
"nohistory": "Chan eil eachdraidh deasachaidh aig an duilleag seo.",
- "currentrev": "Lethbhreac làithreach",
+ "currentrev": "Am mùthadh mu dheireadh",
"currentrev-asof": "Am mùthadh mu dheireadh on $1",
"revisionasof": "Mùthadh on $1",
- "revision-info": "Lèirmheas mar a bha e $1 le $2",
+ "revision-info": "Am mùthadh mar a bha e $1 le $2 $7",
"previousrevision": "← Mùthadh nas sine",
"nextrevision": "Mùthadh nas ùire →",
"currentrevisionlink": "Am mùthadh mu dheireadh",
"last": "roimhe",
"page_first": "Toiseach",
"page_last": "Deireadh",
- "histlegend": "Taghadh nan diofar: comharraich bogsaichean rèidio nam mùthaidhean gus coimeas a dhèanamh agus put Enter no am putan gu h-ìosal.<br />\nMìneachadh: '''({{int:cur}})''' = an diofar eadar e 's am mùthadh as ùire, '''({{int:last}})''' = an diofar eadar e 's am mùthadh roimhe, '''{{int:minoreditletter}}''' = deasachadh beag.",
+ "histlegend": "Taghadh nan diofar: comharraich bogsaichean rèidio nam mùthaidhean gus coimeas a dhèanamh agus put Enter no am putan gu h-ìosal.<br />\nTreòir: <strong>({{int:cur}})</strong> = an diofar eadar e 's am mùthadh as ùire, <strong>({{int:last}})</strong> = an diofar eadar e 's am mùthadh roimhe, <strong>{{int:minoreditletter}}</strong> = deasachadh beag.",
"history-fieldset-title": "An eachdraidh brabhsaidh",
"history-show-deleted": "Na chaidh sguabadh às a-mhàin",
"histfirst": "as sine",
"histlast": "as ùire",
- "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
+ "historysize": "(%1 {{PLURAL:$1|bhaidht|bhaidht|baidhtichean|baidht}})",
"historyempty": "(falamh)",
"history-feed-title": "Eachdraidh nam mùthaidhean",
- "history-feed-description": "Eachdraidh nam mùthaidhean airson na duilleige seo air an uici",
+ "history-feed-description": "Eachdraidh nam mùthaidhean airson na duilleige seo air an uicidh",
"history-feed-item-nocomment": "$1 $2",
- "history-feed-empty": "Chan eil an duilleag a dh'iarr thu ann.\nDh'fhaoidte gun deach a sguabadh às an uici no gun deach ainm ùr a chur air.\nFeuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
+ "history-feed-empty": "Chan eil an duilleag a dh'iarr thu ann.\nDh'fhaoidte gun deach a sguabadh às an uicidh no gun deach ainm ùr a chur air.\nFeuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uicidh]]",
"rev-deleted-comment": "(chaidh gearr-chunntas an deasachaidh a thoirt air falbh)",
"rev-deleted-user": "(chaidh an t-ainm-cleachdaiche a thoirt air falbh)",
"rev-deleted-event": "(chaidh gnìomh an loga a thoirt air falbh)",
- "rev-deleted-user-contribs": "[chaidh an t-ainm-cleachdaiche no an seòladh IP a thoirt air falbh - chan fhaic na com-pàirtichean an deasachadh]",
- "rev-deleted-text-permission": "Chaidh mùthadh na duilleige seo '''a sguabadh às'''.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
- "rev-deleted-text-unhide": "Chaidh mùthadh na duilleige seo '''a sguabadh às'''.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].\n'S urrainn dhut [$1 am mùthadh seo fhaicinn fhathast] ma tha thu airson leantainn air adhart.",
- "rev-suppressed-text-unhide": "Chaidh mùthadh na duilleige seo '''a mhùchadh'''.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].\n'S urrainn dhut [$1 am mùthadh seo fhaicinn fhathast] ma tha thu airson leantainn air adhart.",
- "rev-deleted-text-view": "Chaidh mùthadh na duilleige seo '''a sguabadh às'''.\n'S urrainn dhut coimhead air, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
- "rev-suppressed-text-view": "Chaidh mùthadh na duilleige seo '''a mhùchadh'''.\n'S urrainn dhut coimhead air, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].",
- "rev-deleted-no-diff": "Chan fhaic thu an diff seo a chionn 's gun deach aon dhe na mùthaidhean '''a sguabadh às'''.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
- "rev-suppressed-no-diff": "Chan fhaic thu an diff seo a chionn 's gun deach aon dhe na mùthaidhean '''a sguabadh às'''.",
- "rev-deleted-unhide-diff": "Chaidh mùthadh dhen diff seo '''a sguabadh às'''.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].\n'S urrainn dhut [$1 coimhead air an diff seo fhathast] ma tha thu airson leantainn air adhart.",
- "rev-suppressed-unhide-diff": "Chaidh mùthadh an diff seo '''a mhùchadh'''.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].\n'S urrainn dhut [$1 coimhead air an diff seo fhathast] ma tha thu airson leantainn air adhart.",
- "rev-deleted-diff-view": "Chaidh mùthadh an diff seo '''a sguabadh às'''.\n'S urrainn dhut coimhead air an diff seo, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
- "rev-suppressed-diff-view": "Chaidh mùthadh an diff seo '''a mhùchadh'''.\n'S urrainn dhut coimhead air an diff seo, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].",
+ "rev-deleted-user-contribs": "[chaidh an t-ainm-cleachdaiche no an seòladh IP a thoirt air falbh - chaidh an deasachadh fhalach o liosta na h-obrach]",
+ "rev-deleted-text-permission": "Chaidh mùthadh na duilleige seo <strong>a sguabadh às</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
+ "rev-deleted-text-unhide": "Chaidh mùthadh na duilleige seo <strong>a sguabadh às</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].\n'S urrainn dhut [$1 am mùthadh seo fhaicinn fhathast] ma tha thu airson leantainn air adhart.",
+ "rev-suppressed-text-unhide": "Chaidh mùthadh na duilleige seo <strong>a mhùchadh</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].\n'S urrainn dhut [$1 am mùthadh seo fhaicinn fhathast] ma tha thu airson leantainn air adhart.",
+ "rev-deleted-text-view": "Chaidh mùthadh na duilleige seo <strong>a sguabadh às</strong>.\n'S urrainn dhut coimhead air, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
+ "rev-suppressed-text-view": "Chaidh mùthadh na duilleige seo <strong>a mhùchadh</strong>.\n'S urrainn dhut coimhead air, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].",
+ "rev-deleted-no-diff": "Chan fhaic thu an diofar seo a chionn 's gun deach aon dhe na mùthaidhean <strong>a sguabadh às</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
+ "rev-suppressed-no-diff": "Chan fhaic thu an diofar seo a chionn 's gun deach aon dhe na mùthaidhean <strong>a sguabadh às</strong>.",
+ "rev-deleted-unhide-diff": "Chaidh mùthadh an diofair seo <strong>a sguabadh às</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].\n'S urrainn dhut [$1 coimhead air an diofar seo fhathast] ma tha thu airson leantainn air adhart.",
+ "rev-suppressed-unhide-diff": "Chaidh mùthadh an diofair seo <strong>a mhùchadh</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].\n'S urrainn dhut [$1 coimhead air an diofar seo fhathast] ma tha thu airson leantainn air adhart.",
+ "rev-deleted-diff-view": "Chaidh mùthadh an diofair seo <strong>a sguabadh às</strong>.\n'S urrainn dhut coimhead air an diofar seo, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
+ "rev-suppressed-diff-view": "Chaidh mùthadh an diofair seo <strong>a mhùchadh</strong>.\n'S urrainn dhut coimhead air an diofar seo, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].",
"rev-delundel": "seall/falaich",
"rev-showdeleted": "seall",
- "revisiondelete": "Sguab às/neo-dhèan sguabadh às mhùthaidhean",
+ "revisiondelete": "Sguab às/neo-dhèan sguabadh às mùthaidhean",
"revdelete-nooldid-title": "Tha am mùthadh seo mì-dhligheach",
"revdelete-nooldid-text": "Cha do shònraich thu mùthadh airson seo a dhèanamh, chan eil e ann no tha thu a' feuchainn ris am mùthadh làithreach a chur am falach.",
"revdelete-no-file": "Chan eil am faidhle a shònraich thu ann.",
"revdelete-show-file-confirm": "A bheil thu cinnteach gu bheil thu airson coimhead air mùthadh an fhaidhle \"<nowiki>$1</nowiki>\" a chaidh a sguabadh às $2 aig $3?",
"revdelete-show-file-submit": "Tha",
- "revdelete-selected-text": "{{PLURAL:$1|Lèirmheas|Lèirmheas|Lèirmheas|Lèirmheas|Lèirmheasan|Lèirmheas}} de [[:$2]] a thagh thu:",
- "revdelete-selected-file": "{{PLURAL:$1|Tionndadh an fhaidhle|Tionndadh nam faidhlichean|Tionndadh nam faidhlichean|Tionndadh nam faidhlichean|Tionndadh nam faidhlichean|Tionndadh nam faidhlichean}} a thagh thu à [[:$2]]:",
+ "revdelete-selected-text": "{{PLURAL:$1|Am mùthadh|Na mùthaidhean}} air [[:$2]] a thagh thu:",
+ "revdelete-selected-file": "Tionndadh {{PLURAL:$1|an fhaidhle|nam faidhlichean}} a thagh thu airson [[:$2]]:",
"logdelete-selected": "{{PLURAL:$1|An tachartas loga|Na tachartasan loga}} a thagh thu:",
"revdelete-text-text": "Nochdaidh mùthaidhean a chaidh a sguabadh às ann an eachdraidh na duilleige fhathast ach chan fhaic buill a' phobaill cuid dhen t-susbaint aca.",
"revdelete-text-file": "Nochdaidh tionndaidhean dhen fhaidhle a chaidh a sguabadh às ann an eachdraidh na duilleige fhathast ach chan fhaic buill a' phobaill cuid dhen t-susbaint aca.",
"logdelete-text": "Nochdaidh tachartasan san loga a chaidh a sguabadh às ann an eachdraidh na duilleige fhathast ach chan fhaic buill a' phobaill cuid dhen t-susbaint aca.",
"revdelete-text-others": "Gheibh rianairean eile air {{SITENAME}} cothrom air an t-susbaint fhalaichte fhathast agus is urrainn dhaibh an sguabadh às a neo-dhèanamh san dearbh eadar-aghaidh mur an deach cuingeachaidhean a bharrachd a chur orra.",
"revdelete-confirm": "Dearbh gu bheil thu airson seo a dhèanamh, gu bheil thu a' tuigsinn na thachras ri linn agus gu bheil thu a' dèanamh seo a-rèir [[{{MediaWiki:Policy-url}}|a' phoileasaidh]].",
- "revdelete-suppress-text": "Cha bu chòir dhut mùchadh a chleachdadh '''ach''' ann an suidheachaidhean mar seo:\n* Fiosrachadh a dh'fhaodadh a bhith dìteachail\n* Fiosrachadh pearsanta a tha cearr\n*: ''seòladh taige, àireamhan fòn, àireamhan NI is msaa.''",
+ "revdelete-suppress-text": "Cha bu chòir dhut mùchadh a chleachdadh <strong>ach</strong> ann an suidheachaidhean mar seo:\n* Fiosrachadh a dh'fhaodadh a bhith dìteachail\n* Fiosrachadh pearsanta a tha cearr\n*: <em>seòladh taighe, àireamhan fòn, àireamhan NI is msaa.</em>",
"revdelete-legend": "Suidhich cuingeachaidhean na faicsinneachd",
"revdelete-hide-text": "Teacsa a' mhùthaidh",
"revdelete-hide-image": "Falaich susbaint an fhaidhle",
"revdelete-suppress": "Mùch dàta o rianairean agus càch",
"revdelete-unsuppress": "Thoir air falbh na bacaidhean air mùthaidhean a chaidh aiseag",
"revdelete-log": "Adhbhar:",
- "revdelete-submit": "Cuir air {{PLURAL:$1|an lèirmheas|na lèirmheasan}} a thagh thu",
- "revdelete-success": "'''Chaidh so-fhaicsinneachd a' mhùthaidh ùrachadh.'''",
- "revdelete-failure": "'''Cha b' urrainn dhuinn so-fhaicsinneachd a' mhùthaidh ùrachadh:'''\n$1",
- "logdelete-success": "'''Chaidh faicsinneachd an loga a shuidheachadh.'''",
- "logdelete-failure": "'''Cha b' urrainn dhuinn faicsinneachd an loga a shuidheachadh:'''\n$1",
+ "revdelete-submit": "Cuir an sàs e air {{PLURAL:$1|am mùthadh|na mùthaidhean}} a thagh thu",
+ "revdelete-success": "<strong>Chaidh so-fhaicsinneachd a' mhùthaidh ùrachadh.</strong>",
+ "revdelete-failure": "<strong>Cha b' urrainn dhuinn so-fhaicsinneachd a' mhùthaidh ùrachadh:</strong>\n$1",
+ "logdelete-success": "<strong>Chaidh faicsinneachd an loga a shuidheachadh.</strong>",
+ "logdelete-failure": "<strong>Cha b' urrainn dhuinn faicsinneachd an loga a shuidheachadh:</strong>\n$1",
"revdel-restore": "mùth follaiseachd",
"pagehist": "Eachdraidh na duilleige",
"deletedhist": "Eachdraidh a chaidh a sguabadh às",
- "revdelete-hide-current": "Mearachd a' cur am falach an nì dhen $2, $1: Seo an lèirmheas làithreach. Cha ghabh a chur am falach.",
+ "revdelete-hide-current": "Mearachd a' cur am falach an nì dhen $2, $1: Seo am mùthadh làithreach. Cha ghabh a chur am falach.",
"revdelete-show-no-access": "Mearachd a' sealltainn an nì on $2, $1: Tha comharra ann a dh'innseas gu bheil e \"cuingichte\".\nChan eil cothrom agad air.",
"revdelete-modify-no-access": "Mearachd ag atharrachadh an nì on $2, $1: Tha comharra ann a dh'innseas gu bheil e \"cuingichte\".\nChan eil cothrom agad air.",
"revdelete-modify-missing": "Mearachd ag atharrachadh an nì leis an ID $1: Chan eil e san stòr-dàta!",
- "revdelete-no-change": "'''Rabhadh:''' Bha na roghainnean faicsinneachd a dh'iarr thu aig an nì dhen $2, $1 mu thràth.",
+ "revdelete-no-change": "<strong>Rabhadh:</strong> Bha na roghainnean faicsinneachd a dh'iarr thu aig an nì dhen $2, $1 mu thràth.",
"revdelete-concurrent-change": "Mearachd ag atharrachadh an nì on $2, $1: Tha coltas gun deach a staid atharrachadh le cuideigin dìreach nuair a dh'fheuch thusa ri atharrachadh.\nThoir sùil air na logaichean.",
"revdelete-only-restricted": "Mearachd a' cur an nì on $2, $1 am falach: Chan urrainn dhut nithean le rianairean a mhùchadh gun a bhith a' taghadh aon dhe na roghainnean faicsinneachd eile cuideachd.",
"revdelete-reason-dropdown": "*Adhbharan cumanta airson sguabadh às rudan\n** Briseadh còrach-lethbhreac\n** Beachd no fiosrachadh pearsanta mì-iomchaidh\n** Ainm-cleachdaiche mì-iomchaidh\n** Fiosrachadh a dh'fhaodadh a bhith dìteachail",
"revdelete-offender": "Ùghdar a' mhùthaidh:",
"suppressionlog": "Loga nam mùchaidhean",
"suppressionlogtext": "Chì thu liosta nan rudan a chaidh a sguabadh às agus a bhacadh gu h-ìosal, a' gabhail a-steach stuth a chaidh fhalach o rianairean. Faic [[Special:BlockList|liosta nam bacaidhean]] airson liosta nan toirmeasgan is bacaidhean beò.",
- "mergehistory": "Co-aonaich eachdraidhean na duilleige",
- "mergehistory-header": "Leigidh an duilleag seo leat na lèirmheasan aig aon duilleag a cho-aonadh le duilleag nas ùire.\nDèan cinnteach gun glèidh an t-atharrachadh seo leantainneachd eachdraidh na duilleige.",
- "mergehistory-box": "Co-aonaich na lèirmheasan aig dà dhuilleag:",
+ "mergehistory": "Co-aonaich eachdraidhean nan duilleag",
+ "mergehistory-header": "Leigidh an duilleag seo leat na mùthaidhean aig aon duilleag a cho-aonadh le duilleag nas ùire.\nDèan cinnteach gun glèidh an t-atharrachadh seo leantainneachd eachdraidh na duilleige.",
+ "mergehistory-box": "Co-aonaich na mùthaidhean aig dà dhuilleag:",
"mergehistory-from": "An duilleag thùsail:",
"mergehistory-into": "An duilleag targaide:",
"mergehistory-list": "Eachdraidh nan deasachaidhean a ghabhas a cho-aonadh",
- "mergehistory-merge": "Gabhaidh na lèirmheasan a leanas aig [[:$1]] a cho-aonadh le [[:$2]].\nCleachd colbh nam putanan-rèidio gus dìreach na lèirmheasan a cho-aonadh a chaidh a chruthachadh aig an àm a chaidh a shònrachadh no roimhe sin.\nThoir an aire gun dèid an colbh seo ath-shuidheachadh ma chleachdas tu ceanglaichean na seòladaireachd.",
+ "mergehistory-merge": "Gabhaidh na mùthaidhean a leanas aig [[:$1]] a cho-aonadh le [[:$2]].\nCleachd colbh nam putanan-rèidio gus dìreach na mùthaidhean a cho-aonadh a chaidh a chruthachadh aig an àm a chaidh a shònrachadh no roimhe sin.\nThoir an aire gun dèid an colbh seo ath-shuidheachadh ma chleachdas tu ceanglaichean na seòladaireachd.",
"mergehistory-go": "Seall na deasachaidhean a ghabhas a cho-aonadh",
- "mergehistory-submit": "Co-aonaich na lèirmheasan",
- "mergehistory-empty": "Chan eil lèirmheas sam bith ann a ghabhas a cho-aonadh.",
- "mergehistory-success": "Chaidh $3 {{PLURAL:$3|lèirmheas|lèirmheas|lèirmheasan|lèirmheas}} de [[:$1]] a cho-aonadh dha [[:$2]].",
+ "mergehistory-submit": "Co-aonaich na mùthaidhean",
+ "mergehistory-empty": "Chan eil mùthadh sam bith ann a ghabhas a cho-aonadh.",
+ "mergehistory-success": "Chaidh $3 {{PLURAL:$3|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} air [[:$1]] a cho-aonadh dha [[:$2]].",
"mergehistory-fail": "Cha ghabh an eachdraidh a cho-aonadh, thoir sùil air paramadairean na duilleige 's an ama.",
"mergehistory-no-source": "Chan eil an tùs-duilleag $1 ann.",
"mergehistory-no-destination": "Chan eil an an duilleag targaide $1 ann.",
"mergehistory-comment": "Chaidh [[:$1]] a cho-aonadh dha [[:$2]]: $3",
"mergehistory-same-destination": "Chan fhaod an tùs-duilleag is an duilleag targaide a bhith co-ionnann",
"mergehistory-reason": "Adhbhar:",
+ "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
"mergelog": "Loga a' cho-aonaidh",
- "pagemerge-logentry": "chaidh [[$1]] a cho-aonadh dha [[$2]] (lèirmheasan suas ri $3)",
- "revertmerge": "Dì-aontaich",
+ "pagemerge-logentry": "chaidh [[$1]] a cho-aonadh dha [[$2]] (mùthaidhean suas ri $3)",
+ "revertmerge": "Dì-aonaich",
"mergelogpagetext": "Chì thu liosta nan co-aonaidhean as ùire eadar eachdraidh dhuilleagan gu h-ìosail.",
"history-title": "Eachdraidh nam mùthaidhean aig \"$1\"",
- "difference-title": "An diofar eadar na lèirmheasan a rinneadh air \"$1\"",
+ "difference-title": "An diofar eadar na mùthaidhean a rinneadh air \"$1\"",
"difference-title-multipage": "An diofar eadar an dà dhuilleag \"$1\" agus \"$2\"",
"difference-multipage": "(An diofar eadar na duilleagan)",
"lineno": "Loidhne $1:",
"compareselectedversions": "Dèan coimeas eadar na mùthaidhean a thagh thu",
- "showhideselectedversions": "Seall/Falaich na lèirmheasan a thagh thu",
+ "showhideselectedversions": "Seall/Falaich na mùthaidhean a thagh thu",
"editundo": "neo-dhèan",
"diff-empty": "(Gun diofar eatarra)",
- "diff-multi-sameuser": "(Rinn an cleachdaiche {{PLURAL:$1|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}}nach eil 'gan sealltainn)",
- "diff-multi-otherusers": "({{PLURAL:$1|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|$2 chleachdaiche|$2 chleachdaiche|$2 chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} eile nach eil 'gan sealltainn)",
- "diff-multi-manyusers": "({{PLURAL:$1|Aon lèirmheas eadar-mheadhanach||$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|aon chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} gun sealltainn)",
- "difference-missing-revision": "Cha deach {{PLURAL:$2|$2 lèirmheas|$2 lèirmheas|$2 lèirmheas|$2 lèirmheas|$2 lèirmheasan|$2 lèirmheas}} dhen diofar seo ($1) a lorg.\n\nMar is trice, tachraidh seo ma leanas tu ceangal gu diff air duilleag a chaidh a sguabadh às.\nGheibh thu mion-fhiosrachadh ann an [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} loga nan duilleagan a chaidh a sguabadh às].",
+ "diff-multi-sameuser": "(Rinn an cleachdaiche {{PLURAL:$1|$1 mhùthadh|$1 mhùthadh|$1 mùthaidhean|$1 mùthadh}} eadar-mheadhanach nach eil {{PLURAL:$1|'ga shealltainn|$1 'gan sealltainn}})",
+ "diff-multi-otherusers": "({{PLURAL:$1|$1 mhùthadh|$1 mhùthadh|$1 mùthaidhean|$1 mùthadh}} eadar-mheadhanach le {{PLURAL:$2|$2 chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} eile nach eil {{PLURAL:$1|'ga shealltainn|$1 'gan sealltainn}})",
+ "diff-multi-manyusers": "({{PLURAL:$1|$1 mhùthadh|$1 mhùthadh|$1 mùthaidhean|$1 mùthadh}} eadar-mheadhanach le barrachd air {{PLURAL:$2|$2 chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} nach eil {{PLURAL:$1|'ga shealltainn|$1 'gan sealltainn}})",
+ "difference-missing-revision": "Tha {{PLURAL:$2|$2 mhùthadh|$2 mhùthadh|$2 mùthaidhean|$2 mùthadh}} san diofar seo ($1) nach deach a lorg.\n\nMar is trice, tachraidh seo ma leanas tu air ceangal gu diofar air duilleag a chaidh a sguabadh às.\nGheibh thu mion-fhiosrachadh ann an [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} loga nan duilleagan a chaidh a sguabadh às].",
"searchresults": "Toraidhean rannsachaidh",
"searchresults-title": "Lorg \"$1\" am broinn nan toraidhean",
- "toomanymatches": "Fhuaras cus thoraidhean, feuch ceist eile",
"titlematches": "Tiotalan dhuilleagan a tha a' maidseadh",
"textmatches": "Teacsa sna duilleagan a tha co-ionnann",
"notextmatches": "Chan eil tiotal de dhuilleag sam bith a' freagairt ris",
"prevn": "an {{PLURAL:$1|$1}} roimhe",
"nextn": "an ath {{PLURAL:$1|$1}}",
- "prevn-title": "$1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} roimhe",
+ "prevn-title": "{{PLURAL:$1|an $1 toradh|an $1 thoradh|na $1 toraidhean|am $1 toradh}} roimhe",
"nextn-title": "An ath $1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}}",
"shown-title": "Seall $1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} air gach duilleag",
"viewprevnext": "Seall ($1 {{int:pipe-separator}} $2) ($3).",
- "searchmenu-exists": "'''Tha duilleag air a bheil \"[[:$1]]\" air an uicipeid seo.'''",
- "searchmenu-new": "<strong>Cruthaich an duilleag \"[[:$1]]\" air an uicipeid seo!</strong> {{PLURAL:$2|0=|Seall an duilleag a chaidh a lorg ri linn na lorg thu.|Seall na duilleagan a chaidh a lorg ri linn na lorg thu.|Seall na duilleagan a chaidh a lorg ri linn na lorg thu.|Seall na duilleagan a chaidh a lorg ri linn na lorg thu.|Seall na duilleagan a chaidh a lorg ri linn na lorg thu.|Seall na duilleagan a chaidh a lorg ri linn na lorg thu.}}'",
+ "searchmenu-exists": "<strong>Tha duilleag air a bheil \"[[:$1]]\" air an uicidh seo.</strong> {{PLURAL:$2|0=|Seall na toraidhean luirg eile cuideachd.}}",
+ "searchmenu-new": "<strong>Cruthaich an duilleag \"[[:$1]]\" air an uicidh seo!</strong> {{PLURAL:$2|0=|Faic an duilleag a chaidh a lorg ri linn na lorg thu cuideachd.|Faic na toraidhean luirg cuideachd.}}",
"searchprofile-articles": "Duilleagan susbainte",
"searchprofile-images": "Ioma-mheadhanan",
"searchprofile-everything": "Gach rud",
"searchprofile-images-tooltip": "Lorg faidhlichean",
"searchprofile-everything-tooltip": "Lorg am broinn susbaint sam bith (a' gabhail a-steach nan duilleagan deasbaireachd)",
"searchprofile-advanced-tooltip": "Lorg am broinn ainm-spàsan gnàthaichte",
- "search-result-size": "$1 ({{PLURAL:$2 fhacal|$2 fhacal|$2 faclan|$2 facal}})",
- "search-result-category-size": "{{PLURAL:$1|1 bhall|$1 bhall|$1 bhuill|$1 ball}} ({{PLURAL:$2|1 fho-roinn|$2 fho-roinn|$2 fo-roinnean|$2 fo-roinn}}, {{PLURAL:$3|1 fhaidhle|$3 fhaidhle|$3 faidhlichean|$3 faidhle}})",
+ "search-result-size": "$1 ({{PLURAL:$2|$2 fhacal|$2 fhacal|$2 faclan|$2 facal}})",
+ "search-result-category-size": "{{PLURAL:$1|$1 bhall|$1 bhall|$1 bhuill|$1 ball}} ({{PLURAL:$2|$2 fho-roinn-seòrsa|$2 fho-roinn-seòrsa|$2 fo-roinnean-seòrsa|$2 fo-roinn-seòrsa}}, {{PLURAL:$3|$3 fhaidhle|$3 fhaidhle|$3 faidhlichean|$3 faidhle}})",
"search-result-score": "Buntainneas: $1%",
"search-redirect": "(ag ath-sheòladh $1)",
"search-section": "(earrann $1)",
"search-relatedarticle": "Co-cheangailte",
"searchrelated": "co-cheangailte",
"searchall": "a h-uile",
- "showingresults": "A' nochdadh suas gu $1 {{PLURAL:$1|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
- "showingresultsinrange": "A' sealltainn suas ri {{PLURAL:$1|<strong>$1</strong> toradh|<strong>$1</strong> toradh|<strong>$1</strong> toradh|<strong>$1</strong> toradh|<strong>$1</strong> toraidhean|<strong>$1</strong> toradh}} san rainse eadar #<strong>$2</strong> is #<strong>$3</strong>.",
- "showingresultsnum": "A' nochdadh '''$3''' {{PLURAL:$3|$3 toradh|$3 thoradh|$3 toraidhean|$3 toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
- "showingresultsheader": "{{PLURAL:$5|Toradh '''$1''' à '''$3'''|Toraidhean '''$1 - $2''' of '''$3'''}} airson '''$4'''",
+ "showingresults": "A' sealltainn suas ri <strong>$1</strong> {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} gu h-ìosal a' tòiseachadh le àireamh <strong>$2</strong>.",
+ "showingresultsinrange": "A' sealltainn suas ri <strong>$1</strong> {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} san rainse eadar àireamh <strong>$2</strong> is <strong>$3</strong>.",
+ "showingresultsnum": "A' sealltainn <strong>$3</strong> {{PLURAL:$3|toradh|thoradh|toraidhean|toradh}} gu h-ìosal a' tòiseachadh le àireamh <strong>$2</strong>.",
+ "showingresultsheader": "{{PLURAL:$5|Toradh <strong>$1</strong> à <strong>$3</strong>|Toraidhean <strong>$1 - $2</strong> à <strong>$3</strong>}} airson <strong>$4</strong>",
"search-nonefound": "Cha do fhreagair toradh sam bith ri d' iarrtas.",
"powersearch-legend": "Rannsachadh adhartach",
- "powersearch-ns": "Lorg ann an namespaces:",
+ "powersearch-ns": "Lorg ann an ainm-spàsan:",
"powersearch-togglelabel": "Sgrùd:",
"powersearch-toggleall": "Na h-uile",
"powersearch-togglenone": "Chan eil gin",
+ "powersearch-remember": "Cuir na thagh thu sa chuimhne airson lorg ri teachd",
"search-external": "Lorg air an taobh a-muigh",
"searchdisabled": "Tha lorg air {{SITENAME}} à comas.\n'S urrainn dhut lorg a dhèanamh air Google san eadar-àm.\nFaodaidh gum bi inneacsan susbaint {{SITENAME}} tuilleadh 's sean ge-tà.",
"search-error": "Thachair mearachd fhad 's a bha sinn a' lorg an-seo: $1",
"prefs-rc": "Mùthaidhean ùra",
"prefs-watchlist": "An clàr-faire",
"prefs-watchlist-days": "Co mheud latha a sheallar air a' chlàr-fhaire:",
- "prefs-watchlist-days-max": "{{PLURAL:$1|latha|latha|làithean|latha}} air a' char as motha",
+ "prefs-watchlist-days-max": "$1 {{PLURAL:$1|latha|latha|làithean|latha}} air a' char as motha",
"prefs-watchlist-edits": "An àireamh as motha de mhùthaidhean a thèid a shealltainn air a' chlàr-fhaire leudaichte:",
"prefs-watchlist-edits-max": "Àireamh as motha: 1000",
"prefs-watchlist-token": "Tòcan a' chlàir-fhaire:",
"stub-threshold": "An stairsneach airson fòrmatadh <a href=\"#\" class=\"stub\">cheanglaichean nam bun</a> (bytes):",
"stub-threshold-disabled": "À comas",
"recentchangesdays": "Co mheud latha a thèid a shealltainn sna mùthaidhean ùra:",
- "recentchangesdays-max": "{{PLURAL:$1|latha|latha|làithean|latha}} air a' char as motha",
+ "recentchangesdays-max": "$1 {{PLURAL:$1|latha|latha|làithean|latha}} air a' char as motha",
"recentchangescount": "Uiread a dheasachaidhean a thèid a shealltainn a ghnàth:",
"prefs-help-recentchangescount": "Tha seo a' gabhail a-steach mùthaidhean ùra, eachdraidhean nan duilleagan is logaichean.",
+ "prefs-help-watchlist-token2": "Seo an iuchair dhìomhair airson inbhir-lìn a' chlàir-fhaire agad.\n'S urrainn do dhuine sam bith a bhios eòlach air an clàr-faire agad a leughadh, mar sin na co-roinn e.\n'S urrainn dhut [[Special:ResetTokens|ath-shuidheachadh]] ma bhios feum agad air seo.",
"savedprefs": "Tha na roghainnean agad air an sàbhaladh.",
"timezonelegend": "Roinn-tìde:",
"localtime": "An t-àm ionadail:",
- "timezoneuseserverdefault": "Cleachd bun-roghainn na h-Uicipeid ($1)",
- "servertime": "Àm an fhrithealaichte:",
+ "timezoneuseserverdefault": "Cleachd bun-roghainn na h-uicidh ($1)",
+ "timezoneuseoffset": "Eile (sònraich an fhrith-àireamh)",
+ "servertime": "Àm an fhrithealaiche:",
"guesstimezone": "Lìon on bhrabhsair",
"timezoneregion-africa": "Afraga",
"timezoneregion-america": "Aimeireaga",
"timezoneregion-pacific": "An Cuan Sèimh",
"allowemail": "Ceadaich post-d o chleachdaichean eile",
"prefs-searchoptions": "Lorg",
- "prefs-namespaces": "Namespaces",
+ "prefs-namespaces": "Ainm-spàsan",
"default": "an roghainn bhunaiteach",
"prefs-files": "Faidhlichean",
"prefs-custom-css": "CSS gnàthaichte",
"prefs-emailconfirm-label": "Dearbhadh puist-d:",
"youremail": "Post-dealain:",
"username": "{{GENDER:$1|Ainm-cleachdaiche}}:",
- "prefs-memberingroups": "{{GENDER:$2|Ball}} ann an {{PLURAL:$1|bhuidheann|bhuidheann|buidhnean|buidheann}}:",
+ "prefs-memberingroups": "{{GENDER:$2|'Na bhall|'Na ball}} {{PLURAL:$1|sa bhuidheann|sna buidhnean}}:",
+ "prefs-memberingroups-type": "$1",
"prefs-registration": "Àm clàraidh:",
+ "prefs-registration-date-time": "$1",
"yourrealname": "An dearbh ainm a th' ort:",
"yourlanguage": "Cànan:",
"yourvariant": "Eug-samhail cànan na susbaint:",
"badsiglength": "Tha an t-earr-sgrìobhadh agad ro fhada.\nChan fhaod e a bhith nas fhaide na $1 {{PLURAL:$1|charactar|charactar|caractaran|caractar}}.",
"yourgender": "Dè a' ghnè a tha annad:",
"gender-unknown": "B' fhearr leam gun a bhith 'ga leigeil ris",
- "gender-male": "Deasaichidh e duilleagan na h-Uicipeid",
+ "gender-male": "Deasaichidh e duilleagan na h-uicidh",
"gender-female": "Deasaichidh i duilleagan na h-Uicipeid",
+ "prefs-help-gender": "Cha leig thu leas an roghainn seo a shuidheachadh.\nCleachdaidh am bathar-bog an luach aice gus bruidhinn riut le d' ainm 's iomradh a thoirt ort gu càch leis a' ghnè ghramataigeach iomchaidh.\nBidh am fiosrachadh seo poblach.",
"email": "Post-d:",
+ "prefs-help-realname": "Cha leig thu leas innse dè am fìor-ainm a tha ort.\nMa bheir thu seachad e, thèid seo a chleachdadh gus urram a thoirt dhut airson do chuid obrach.",
"prefs-help-email": "Chan leig thu leas post-dealain a chur ann ach bidh feum air ma dhìochuimhnicheas tu am facal-faire agad 's ma dh'iarras tu fear ùr.",
- "prefs-help-email-others": "'S urrainn dhut leigeil le daoine eile post-dealain a chur thugad tro cheangal air an duilleag agad.\nChan fhaicear an seòladh fhèin nuair a chuireas cuideigin post-dealain thugad.",
+ "prefs-help-email-others": "'S urrainn dhut leigeil le daoine eile post-dealain a chur thugad tro cheangal air duilleag a' chleachdaiche no deasbaireachd agad.\nChan fhaicear an seòladh fhèin nuair a chuireas cuideigin post-dealain thugad.",
"prefs-help-email-required": "Tha feum air seòladh puist-d.",
"prefs-info": "Fiosrachadh bunasach",
"prefs-i18n": "Cànan",
"prefs-displayrc": "Roghainnean taisbeanaidh",
"prefs-displaywatchlist": "Roghainnean taisbeanaidh",
"prefs-tokenwatchlist": "Tòcan",
- "prefs-diffs": "Diffs",
+ "prefs-diffs": "Diofaran",
+ "prefs-help-prefershttps": "Thèid an roghainn seo a chur an sàs an ath thuras a nì thu logadh a-steach.",
+ "prefs-tabs-navigation-hint": "Gliocas: 'S urrainn dhut na h-iuchraichean saighde chlì 's dheas a chleachdadh gus leum a ghearradh o thaba gu taba air liosta nan taba.",
"email-address-validity-valid": "Tha coltas gu bheil am post-d dligheach",
"email-address-validity-invalid": "Cuir a-steach post-d dligheach",
"userrights": "Stiùireadh ceadan a' chleachdaiche",
"userrights-lookup-user": "Stiùirich na buidhnean chleachdaichean",
"userrights-user-editname": "Cuir a-steach ainm-cleachdaiche:",
"editusergroup": "Deasaich na buidhnean chleachdaichean",
- "editinguser": "Ag atharrachadh ceadan a' chleachdaiche '''[[User:$1|$1]]''' $2",
+ "editinguser": "Ag atharrachadh ceadan a' chleachdaiche <strong>[[User:$1|$1]]</strong> $2",
"userrights-editusergroup": "Deasaich na buidhnean chleachdaichean",
"saveusergroups": "Sàbhail na buidhnean chleachdaichean",
"userrights-groupsmember": "Ball de:",
"userrights-groupsmember-auto": "Ball fèin-obrachail de:",
+ "userrights-groupsmember-type": "$1",
+ "userrights-groups-help": "'S urrainn dhut na buidhnean sa bheil an cleachdaiche seo 'na bhall atharrachadh:\n* Is ciall dha chromag sa bhogsa gu bheil an cleachdaiche seo 'na bhall sa buidheann.\n* Is ciall dha bhogsa gun chromag ris nach eil an cleachdaiche seo 'na bhall sa buidheann.\n* Innsidh * dhut nach urrainn dhut am buidheann a thoirt air falbh nuair a bhios tu air a chur ris no an caochladh.",
"userrights-reason": "Adhbhar:",
- "userrights-no-interwiki": "Chan eil cead agad ceadan chleachdaichean a dheasachadh air uicipeidean eile.",
+ "userrights-no-interwiki": "Chan eil cead agad ceadan chleachdaichean a dheasachadh air uicidhean eile.",
"userrights-nodatabase": "Chan eil an stòr-dàta $1 ann no chan e fear ionadail a tha ann.",
+ "userrights-nologin": "Feumaidh tu [[Special:UserLogin|logadh a-steach]] le cunntas rianaire ach an toir thu ceadan nam ball seachad.",
+ "userrights-notallowed": "Chan eil cead agad gus ceadan nam ball a chur ris no a thoirt air falbh.",
"userrights-changeable-col": "Buidhnean as urrainn dhut atharrachadh",
+ "userrights-unchangeable-col": "Buidhnean nach urrainn dhut atharrachadh",
+ "userrights-irreversible-marker": "$1*",
+ "userrights-conflict": "Tha còmhstri le atharraichean air ceadan nam ball! Thoir sùil air a-rithist 's dearbhaich na h-atharraichean agad.",
+ "userrights-removed-self": "Tha thu air na ceadan agad fhèin a thoirt air falbh. Mar sin, chan eil cead agad tuilleadh gus an duilleag seo inntrigeadh.",
"group": "Buidheann:",
"group-user": "Cleachdaichean",
+ "group-autoconfirmed": "Cleachdaichean fèin-dearbhte",
"group-bot": "Bots",
"group-sysop": "Rianadairean",
"group-bureaucrat": "Biurocratan",
+ "group-suppress": "Marasgalan",
"group-all": "(na h-uile)",
- "group-user-member": "{{GENDER:$1|cleachdaiche}}",
- "group-bot-member": "{{GENDER:$1|bot}}",
- "group-sysop-member": "{{GENDER:$1|rianaire}}",
- "group-bureaucrat-member": "{{GENDER:$1|biùrocrat}}",
+ "group-user-member": "cleachdaiche",
+ "group-autoconfirmed-member": "cleachdaiche fèin-dearbhte",
+ "group-bot-member": "bot",
+ "group-sysop-member": "rianaire",
+ "group-bureaucrat-member": "biùrocrat",
+ "group-suppress-member": "marasgal",
"grouppage-user": "{{ns:project}}:Cleachdaichean",
"grouppage-autoconfirmed": "{{ns:project}}:Cleachdaichean fèin-dearbhte",
"grouppage-bot": "{{ns:project}}:Bots",
"grouppage-sysop": "{{ns:project}}:Rianadairean",
"grouppage-bureaucrat": "{{ns:project}}:Biurocratan",
+ "grouppage-suppress": "{{ns:project}}:Marasgal",
"right-read": "Cead-leughaidh",
"right-edit": "Cead-deasachaidh",
"right-createpage": "Cead-cruthachaidh (de dhuilleagan nach eil 'nan duilleagan deasbaireachd)",
"right-createtalk": "Cead duilleagan deasbaireachd a chruthachadh",
"right-createaccount": "Cead cunntasan ùra a chruthachadh",
+ "right-minoredit": "Cead comharra a chur nach e ach deasachadh beag a th' ann",
"right-move": "Cead duilleagan a ghluasad",
"right-move-subpages": "Cead duilleagan a ghluasad leis na fo-dhuilleagan aca",
"right-move-rootuserpages": "Cead duilleagan chleachdaichean root a ghluasad",
+ "right-move-categorypages": "Cead duilleagan roinn-seòrsa a ghluasad",
"right-movefile": "Cead faidhlichean a ghluasad",
+ "right-suppressredirect": "Cead gun a bhith a' cruthachadh ath-stiùiridhean o na duilleagan tùsail nuair a ghluaisear duilleag",
"right-upload": "Cead faidhlichean a luchdadh suas",
"right-reupload": "Cead sgrìobhadh thairis air duilleagan a tha ann",
- "right-upload_by_url": "Faidhlichean a luchdadh suas o URL",
- "newuserlogpage": "Loga cruthachaidh de chleachdaichean",
+ "right-reupload-own": "Cead sgrìobhadh thairis air faidhlichean a tha ann ma a chaidh an luchdadh suas leis an dearbh neach",
+ "right-reupload-shared": "Cead faidhlichean a thar-àithneadh gu h-ionadail a tha san ionad-tasgaidh nam meadhanan co-roinnte",
+ "right-upload_by_url": "Cead faidhlichean a luchdadh suas o URL",
+ "right-purge": "Cead tasgadan an làraich airson duilleag a ghlanadh gun dearbhadh",
+ "right-autoconfirmed": "Gun chuingeachadh air tricead nan gnìomhan a-rèir IP",
+ "right-bot": "Ceadan pròiseis fèin-obrachail aige",
+ "right-nominornewtalk": "Cead deasachaidhean beaga a dhèanamh air duilleagan deasbaid gun bhrodadh airson teachdaireachdan ùra a chruthachadh",
+ "right-apihighlimits": "Cead crìochan as àirde le ceistean API a chleachdadh",
+ "right-writeapi": "Cead API sgrìobhaidh a chleachdadh",
+ "right-delete": "Cead duilleagan a sguabadh às",
+ "right-bigdelete": "Cead duilleagan aig a bheil eachdraidh mòr a sguabadh às",
+ "right-deletelogentry": "Cead nithean sònraichte an loga a sguabadh às 's aiseag",
+ "right-deleterevision": "Cead mùthaidhean sònraichte aig duilleagan a sguabadh às 's aiseag",
+ "right-deletedhistory": "Cead nithean an eachdraidh a chaidh a sguabadh às a shealltainn gun an teacsa ceangailte riutha",
+ "right-deletedtext": "Cead teacsa 's atharraichean eadar mùthaidhean air an sguabadh às a shealltainn",
+ "right-browsearchive": "Cead lorg sna duilleagan air an sguabadh às",
+ "right-undelete": "Cead duilleagan air an sguabadh às aiseag",
+ "right-suppressrevision": "Cead sùil a thoirt air mùthaidhean a chaidh a sguabadh às 's am falach o na rianairean 's an aiseag",
+ "right-suppressionlog": "Cead logaichean prìobhaideach a shealltainn",
+ "right-block": "Cead càch a bhacadh o dheasachadh",
+ "right-blockemail": "Cead cleachdaiche a bhacadh o chur phost-d",
+ "right-hideuser": "Cead ainm-chleachdaiche a bhacadh 's fhalach on t-sealladh phoblach",
+ "right-ipblock-exempt": "Cead bacaidhean IP, bacaidhean fèin-obrachail 's bacaidhean rainse a leigeil seachad",
+ "right-proxyunbannable": "Cead bacadh fèin-obrachail phrogsaidhean a leigeil seachad",
+ "right-unblockself": "Cead bacadh a thoirt uaithe fhèin",
+ "right-protect": "Cead leibheilean an dìona atharrachadh 's duilleagan le dìon o bhith mar eas a dheasachadh",
+ "right-editprotected": "Cead gus duilleagan le dìon \"{{int:protect-level-sysop}}\" a dheasachadh",
+ "right-editsemiprotected": "Cead gus duilleagan le dìon \"{{int:protect-level-autoconfirmed}}\" a dheasachadh",
+ "right-editinterface": "Cead gus eadar-aghaidh nan cleachdaichean a dheasachadh",
+ "right-editusercssjs": "Cead gus faidhlichean CSS 's JavaScript càich a dheasachadh",
+ "right-editusercss": "Cead gus faidhlichean CSS càich a dheasachadh",
+ "right-edituserjs": "Cead gus faidhlichean JavaScript càich a dheasachadh",
+ "right-editmyusercss": "Cead gus faidhlichean CSS agad fhèin a dheasachadh",
+ "right-editmyuserjs": "Cead gus faidhlichean JavaScript agad fhèin a dheasachadh",
+ "right-viewmywatchlist": "Cead an clàr-faire agad fhèin a shealltainn",
+ "right-editmywatchlist": "Cead an clàr-faire agad fhèin a dheasachadh. Thoir an aire gun cuir cuid a gnìomhan duilleagan ris fiù 's mur eil an cead seo agad.",
+ "right-viewmyprivateinfo": "Cead an dàta prìobhaideach agad fhèin (m.e. seòladh puist-d, fìor-ainm) a shealltainn",
+ "right-editmyprivateinfo": "Cead an dàta prìobhaideach agad fhèin (m.e. seòladh puist-d, fìor-ainm) a dheasachadh",
+ "right-editmyoptions": "Cead na roghainnean agad fhèin a dheasachadh",
+ "right-rollback": "Cead gus na h-atharraichean leis a' chleachdaiche mu dheireadh air duilleag sònraichte a roladh air ais gu luath",
+ "right-markbotedits": "Cead dèiligeadh ri deasachaidhean rolaidh air ais 'nan deasachaidhean bota",
+ "right-noratelimit": "Gun chuingeachadh air tricead nan gnìomhan",
+ "right-import": "Cead duilleagan ion-phortadh o uicidhean eile",
+ "right-importupload": "Cead duilleagan ion-phortadh o luchdadh suas faidhle",
+ "right-patrol": "Cead comharra freiceadain a chur ri deasachaidhean càich",
+ "right-autopatrol": "Cead gun dèid comharra freiceadain a chur ris na deasachaidhean agad fhèin gu fèin-obrachail",
+ "right-patrolmarks": "Cead gus na comharran freiceadain o chionn goirid a shealltainn",
+ "right-unwatchedpages": "Cead duilleagan air an toirt far a' chlàir-fhaire a shealltainn",
+ "right-mergehistory": "Cead eachdraidh nan duilleagan a cho-aonachadh",
+ "right-userrights": "Cead gus gach cead cleachdaiche a dheasachadh",
+ "right-userrights-interwiki": "Cead gus ceadan nan chleachdaichean aig uicidhean eile a dheasachadh",
+ "right-siteadmin": "Cead gus an stòr-dàta a glasadh 's a' ghlas a thoirt fo bharr",
+ "right-override-export-depth": "Cead gus duilleagan às-phortadh, a' gabhail a-seach duilleagan ceangailte suas ri doimhneachd de 5",
+ "right-sendemail": "Cead gus puist-d a chur gu cleachdaichean eile",
+ "right-passwordreset": "Cead gus puist-d ath-shuidheachadh nam facal-faire a shealltainn",
+ "newuserlogpage": "Loga cruthachadh nan cleachdaichean",
+ "newuserlogpagetext": "Seo loga nan cleachdaichean a chaidh a chruthachadh.",
"rightslog": "Loga còraichean a' chleachdaiche",
+ "rightslogtext": "Seo loga nan atharraichean air ceadan nan cleachdaichean.",
+ "action-read": "leugh an duilleag seo",
"action-edit": "deasaich an duilleag seo",
+ "action-createpage": "cruthaich duilleagan",
+ "action-createtalk": "cruthaich duilleagan deasbaireachd",
+ "action-createaccount": "cruthaich an cunntas cleachdaiche seo",
+ "action-history": "seall eachdraidh na duilleige seo",
+ "action-minoredit": "cuir comharra nach e ach deasachadh beag a th' ann",
"action-move": "gluais an duilleag seo",
- "nchanges": "{{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}",
+ "action-move-subpages": "gluais an duilleag seo 's a fo-dhuilleagan",
+ "action-move-rootuserpages": "gluais duilleagan chleachdaichean root",
+ "action-move-categorypages": "gluais duilleagan roinn-seòrsa",
+ "action-movefile": "gluais am faidhle seo",
+ "action-upload": "luchdaich suas am faidhle seo",
+ "action-reupload": "sgrìobh thairis air an fhaidhle seo a tha ann",
+ "action-reupload-shared": "tar-àithn am faidhle seo ann an ionad-tasgaidh co-roinnte",
+ "action-upload_by_url": "luchdaich suas am faidhle seo o URL",
+ "action-writeapi": "cleachd API sgrìobhaidh",
+ "action-delete": "sguab às an duilleag seo",
+ "action-deleterevision": "sguab às am mùthadh seo",
+ "action-deletedhistory": "seall eachdraidh an sguabaidh às aig an duilleag seo",
+ "action-browsearchive": "lorg sna duilleagan air an sguabadh às",
+ "action-undelete": "neo-dhèan sguabadh às na duilleige seo",
+ "action-suppressrevision": "thoir sùil air a' mhùthadh fhalaichte seo 's aisig e",
+ "action-suppressionlog": "seall an loga prìobhaideach seo",
+ "action-block": "bac an cleachdaiche seo o dheasachadh",
+ "action-protect": "atharraich leibheil dìon na duilleige seo",
+ "action-rollback": "roilig na h-atharraichean leis a' chleachdaiche mu dheireadh air duilleag sònraichte a air ais gu luath",
+ "action-import": "ion-phortaich duilleagan o uicidh eile",
+ "action-importupload": "ion-phortaich duilleagan o luchdadh suas faidhle",
+ "action-patrol": "cuir comharra freiceadain ri deasachaidhean càich",
+ "action-autopatrol": "faigh comharra freiceadain fèin-obrachail air na dheasaich thu",
+ "action-unwatchedpages": "seall na duilleagan air an toirt far a' chlàir-fhaire",
+ "action-mergehistory": "co-aonaich eachdraidh nan duilleagan",
+ "action-userrights": "deasaich gach cead cleachdaiche",
+ "action-userrights-interwiki": "deasaich ceadan nan chleachdaichean aig uici eile",
+ "action-siteadmin": "glais an stòr-dàta no thoir a' ghlas fo bharr",
+ "action-sendemail": "cuir puist-d",
+ "action-editmywatchlist": "deasaich an clàr-faire agad",
+ "action-viewmywatchlist": "seall an clàr-faire agad",
+ "action-viewmyprivateinfo": "seall am fiosrachadh prìobhaideach agad",
+ "action-editmyprivateinfo": "deasaich am fiosrachadh prìobhaideach agad",
+ "nchanges": "$1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}",
+ "enhancedrc-since-last-visit": "$1 on tadhal mu dheireadh",
+ "enhancedrc-history": "eachdraidh",
"recentchanges": "Mùthaidhean ùra",
"recentchanges-legend": "Roghainnean nam mùthaidhean ùra",
- "recentchanges-summary": "Cum sùil air na mùthaidhean as ùire a nithear air an uici air an duilleag seo.",
- "recentchanges-feed-description": "Cum sùil air na mùthaidhean as ùire a nithear air an uici seo san inbhir seo.",
+ "recentchanges-summary": "Cum sùil air na mùthaidhean as ùire a nithear air an uicidh air an duilleag seo.",
+ "recentchanges-noresult": "Cha fhreagair atharrachadh sam bith san ùine seo ris na cuspairean-deuchainn seo.",
+ "recentchanges-feed-description": "Cum sùil air na mùthaidhean as ùire a nithear air an uicidh seo san inbhir seo.",
"recentchanges-label-newpage": "Chruthaich thu duilleag ùr leis a sin",
"recentchanges-label-minor": "Seo mùthadh beag",
"recentchanges-label-bot": "'S e bot a rinn an deasachadh seo",
- "recentchanges-label-unpatrolled": "Cha deach freiceadan tron deasachadh seo fhathast",
+ "recentchanges-label-unpatrolled": "Cha do chuir freiceadan comharra ris an deasachadh seo fhathast",
"recentchanges-label-plusminus": "Seo meud atharrachadh na duilleige ann am byte",
+ "recentchanges-legend-heading": "'''Treòir:'''",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (faic [[Special:NewPages|liosta nan duilleagan ùra]] cuideachd)",
+ "recentchanges-legend-plusminus": "(<em>±123</em>)",
"rcnotefrom": "Gheibhear na mùthaidhean a-mach o <strong>$2</strong> (gu ruige <strong>$1</strong>) gu h-ìosal.",
"rclistfrom": "Seall na mùthaidhean ùra a-mach o $3 $2",
"rcshowhideminor": "$1 mùthaidhean beaga",
+ "rcshowhideminor-show": "Seall",
+ "rcshowhideminor-hide": "Falaich",
"rcshowhidebots": "$1 botaichean",
- "rcshowhideliu": "$1 neach-cleachdaidh clàraichte",
- "rcshowhideanons": "$1 luchd-cleachdaidh gun ainm",
+ "rcshowhidebots-show": "Seall",
+ "rcshowhidebots-hide": "Falaich",
+ "rcshowhideliu": "$1 na cleachdaichean clàraichte",
+ "rcshowhideliu-show": "Seall",
+ "rcshowhideliu-hide": "Falaich",
+ "rcshowhideanons": "$1 na cleachdaichean gun ainm",
+ "rcshowhideanons-show": "Seall",
+ "rcshowhideanons-hide": "Falaich",
"rcshowhidepatr": "$1 na deasachaidhean fo aire freiceadain",
+ "rcshowhidepatr-show": "Seall",
+ "rcshowhidepatr-hide": "Falaich",
"rcshowhidemine": "$1 na mùthaidhean agam",
- "rclinks": "Seall na $1 mùthaidhean mu dheireadh thairis air na $2 làithean mu dheireadh<br />$3",
- "diff": "diof",
+ "rcshowhidemine-show": "Seall",
+ "rcshowhidemine-hide": "Falaich",
+ "rclinks": "Seall {{PLURAL:$1|an $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|am $1 mùthadh}} mu dheireadh thairis air {{PLURAL:$2|an $2 latha|an $2 latha|na $2 làithean|am $2 latha}} mu dheireadh<br />$3",
+ "diff": "diofar",
"hist": "eachd",
"hide": "Falaich",
"show": "Seall",
"minoreditletter": "b",
"newpageletter": "Ù",
"boteditletter": "bt",
+ "unpatrolledletter": "!",
+ "number_of_watching_users_pageview": "[Tha $1 {{PLURAL:$1|chleachdaiche|chleachdaiche|cleachdaichean|cleachdaiche}} a' cumail sùil air]",
+ "rc_categories": "Cuingich gu roinnean-seòrsa (sgaraich le \"|\")",
+ "rc_categories_any": "Roinn-seòrsa sam bith",
+ "rc-change-size": "$1",
+ "rc-change-size-new": "$1 {{PLURAL:$1|bhaidht|bhaidht|baidhtichean|baidht}} às dèidh an atharrachaidh",
+ "newsectionsummary": "Earrann ùr /* $1 */",
"rc-enhanced-expand": "Seall am mion-fhiosrachadh",
"rc-enhanced-hide": "Cuir am mion-fhiosrachadh am falach",
+ "rc-old-title": "Chaidh a chruthachadh mar \"$1\" o thùs",
"recentchangeslinked": "Mùthaidhean co-cheangailte",
"recentchangeslinked-feed": "Mùthaidhean buntainneach",
"recentchangeslinked-toolbox": "Mùthaidhean buntainneach",
"recentchangeslinked-title": "Mùthaidhean co-cheangailte ri \"$1\"",
- "recentchangeslinked-summary": "Seo liosta nam mùthaidhean a chaidh a chur air duilleagan a tha a' ceangal o dhuilleag shònraichte (no ri buill de roinn shònraichte).\nTha duilleagan air [[Special:Watchlist|do chlàr-faire]] ann an litrichean '''troma'''.",
+ "recentchangeslinked-summary": "Seo liosta nam mùthaidhean a chaidh a chur air duilleagan a tha a' ceangal o dhuilleag shònraichte (no ri buill ann an roinn-seòrsa sònraichte).\nTha duilleagan air [[Special:Watchlist|do chlàr-faire]] ann an litrichean <strong>troma</strong>.",
"recentchangeslinked-page": "Ainm na duilleige:",
"recentchangeslinked-to": "Seall mùthaidhean nan duilleagan a tha a' ceangal ris an duilleag sin 'na àite",
"upload": "Luchdaich suas faidhle",
"uploadbtn": "Luchdaich suas faidhle",
+ "reuploaddesc": "Sgur dhen luchdadh suas 's till dhan fhoirm luchdaidh suas",
+ "upload-tryagain": "Cuir tuairisgeul atharraichte an fhaidhle a-null",
+ "uploadnologin": "Chan eil thu air logadh a-steach",
+ "uploadnologintext": "$1 gus faidhlichean a luchdadh suas.",
+ "upload_directory_missing": "Tha pasgan an luchdaidh suas ($1) a dhìth 's cha b' urrainn dhan fhrithealaiche-lìn fear a chruthachadh.",
+ "upload_directory_read_only": "Chan urrainn dhan fhrithealaiche-lìn sgrìobhadh sa phasgan luchdaidh suas ($1).",
+ "uploaderror": "Mearachd leis an luchdadh suas",
+ "upload-recreate-warning": "<strong>Rabhadh: Chaidh faidhle air a bheil an t-ainm seo a sguabadh às no a ghluasad.</strong>\n\nSeo dhut loga an sguabaidh às 's nan gluasad airson na duilleige seo:",
+ "uploadtext": "Cleachd am foirm gu h-ìosal gus faidhlichean a luchdadh suas.\nGus na faidhlichean a chaidh a luchdadh suas roimhe a shealltainn no a lorg annta, rach gu [[Special:FileList|liosta nam faidhlichean air an luchdadh suas]], thèid (ath-)luchdaidhean suas a chur ri [[Special:Log/upload|loga nan luchdaidhean suas]] cuideachd 's na chaidh a sguabadh às ri [[Special:Log/delete|loga nan sguabaidhean às]].\n\nCleachd ceangal ann an aon dhe na cruthan seo gus faidhle a chur am broinn duilleige:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> gus an tionndadh slàn dhen fhaidhle a chleachdadh\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|teacsa alt]]</nowiki></code></strong> cus dreach a tha 200 piogsail a leud a chleachdadh a nochdas ann am bogsa air a' mharghan chlì le \"teacsa alt\" mar thuairisgeul\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> gus ceangal a dhèanamh ris an fhaidhle gu dìreach gun a bhith a' sealltainn an fhaidhle",
+ "upload-permitted": "Seòrsaichean faidhle a tha ceadaichte: $1.",
+ "upload-preferred": "Seòrsaichean faidhle as docha leinn: $1.",
+ "upload-prohibited": "Seòrsaichean faidhle nach eil ceadaichte: $1.",
"uploadlogpage": "Loga an luchdaidh suas",
+ "uploadlogpagetext": "Chì thu na faidhlichean a chaidh a luchdadh suas o chionn goirid gu h-ìosal.\nSeall [[Special:NewFiles|gailearaidh nam faidhlichean ùra]] airson foir-shealladh nas lèirsinniche.",
"filename": "Ainm-faidhle",
"filedesc": "Gearr-chunntas",
"fileuploadsummary": "Gearr-chunntas:",
- "filestatus": "Cor dlighe-sgrìobhaidh:",
+ "filereuploadsummary": "Atharraichean air an fhaidhle:",
+ "filestatus": "Staid còrach-lethbhreac:",
+ "filesource": "Tùs:",
"ignorewarning": "Leig seachad an rabhadh agus sàbhail am faidhle co-dhiù",
+ "ignorewarnings": "Leig seachad rabhadh sam bith",
+ "minlength1": "Feumaidh co-dhiù aon litir a bhith ann an ainm faidhle.",
+ "illegalfilename": "Tha caractaran san ainm faidhle \"$1\" nach eil ceadaichte ann an tiotal duilleige.\nthoir ainm ùr air an fhaidhle 's feuch ris an luchdadh suas a-rithist.",
+ "filename-toolong": "Chan fhaod barrachd air 240 baidht a bhith ann an ainm faidhle.",
"badfilename": "Ainm ìomhaigh air atharrachadh ri \"$1\".",
- "fileexists": "Tha faidhle ann mu thràth air a bheil an t-ainm seo, cuir sùil air <strong>[[:$1]]</strong> mur eil thu buileach cinntach a bheil thu airson atharrachadh.\n[[$1|thumb]]",
+ "filetype-mime-mismatch": "Chan fhreagair leudachan \".$1\" an fhaidhle ris an seòrsa MIME a mhothaich sinn airson an fhaidhle ($2).",
+ "filetype-badmime": "Chan fhaod thu faidhlichean dhen t-seòrsa MIME \"$1\" a luchdadh suas.",
+ "filetype-bad-ie-mime": "Chan fhaod thu am faidhle seo a luchdadh suas on a mhothaicheadh Internet Explorer dha mar \"$1\" nach eil 'na sheòrsa faidhle ceadaichte 's a dh'fhaodadh a bhith cunnartach.",
+ "filetype-unwanted-type": "Cha ghabh sinn ris an seòrsa faidhle <strong>\".$1\"</strong>.\nIs docha leinn {{PLURAL:$3|an seòrsa faidhle|na seòrsaichean faidhle}} $2.",
+ "filetype-banned-type": "Chan eil <strong>\".$1\"</strong> {{PLURAL:$4|'na seòrsa faidhle|'nan seòrsaichean faidhle}} ceadaichte.\nIs $2 {{PLURAL:$3|an seòrsa faidhle|na seòrsaichean faidhle}} ceadaichte.",
+ "filetype-missing": "Chan eil leudachan aig an fhaidhle (can \".jpg\").",
+ "empty-file": "Cha am faidhle a chuir thu a-null falamh.",
+ "file-too-large": "Cha am faidhle a chuir thu a-null ro mhòr.",
+ "filename-tooshort": "Tha ainm an fhaidhle a chuir thu a-null ro ghoirid.",
+ "filetype-banned": "Tha an seòrsa faidhle seo toirmisgte.",
+ "verification-error": "Dh'fhàillig am faidhle seo an dearbhadh.",
+ "hookaborted": "Chaidh sgur dhen atharrachadh a dh'fheuch thu ri dèanamh le leudachan.",
+ "illegal-filename": "Chan eil ainm an fhaidhle ceadaichte.",
+ "overwrite": "Chan fhaod thu sgrìobhadh thairis air faidhle a tha ann mar-thà.",
+ "unknown-error": "Thachair mearachd neo-aithnichte.",
+ "tmp-create-error": "Cha deach leinn faidhle sealach a chruthachadh.",
+ "tmp-write-error": "Mearachd le sgrìobhadh an fhaidhle shealaich.",
+ "large-file": "Mholamaid nach bi faidhlichean nas motha na $1;\ntha am faidhle seo $2 a mheud.",
+ "largefileserver": "Tha am faidhle seo nas motha na tha ceadaichte a-rèir rèiteachadh an fhrithealaiche.",
+ "emptyfile": "Tha am faidhle a luchdaich thu suas falamh a-rèir coltais.\n'S dòcha gu bheil mearachd sgrìobhaidh ann an ainm an fhaidhle.\nDearbhaich an e seo am faidhle a tha thu airson luchdadh suas.",
+ "windows-nonascii-filename": "Cha chuir an uicidh seo taic ri ainm faidhle sa bheil caractaran sònraichte.",
+ "fileexists": "Tha faidhle ann mu thràth air a bheil an t-ainm seo, thoir sùil air <strong>[[:$1]]</strong> mur eil thu buileach cinnteach a bheil thu airson atharrachadh.\n[[$1|thumb]]",
+ "filepageexists": "Chaidh duilleag an tuairisgeil airson na duilleige seo a chruthachadh air <strong>[[:$1]]</strong> mar-thà ach chan eil faidhle air a bheil an t-ainm seo ann an-dràsta.\nCha nochd an gearr-chunntas a chuireas tu a-steach air duilleag an tuairisgeil.\nFeumaidh tu a dheasachadh a làimh ach an nochd an gearr-chunntas agad an-siud.\n[[$1|thumb]]",
+ "fileexists-extension": "Tha faidhle ann air a bheil ainm a tha coltach ris: [[$2|thumb]]\n* Ainm an fhaidhle 'ga luchdadh suas: <strong>[[:$1]]</strong>\n* Ainm an fhaidhle a tha ann: <strong>[[:$2]]</strong>\nFeuch an tagh thu ainm eile.",
+ "fileexists-thumbnail-yes": "Tha coltas an deilbh le meud lùghdaichte <em>(dealbhag)</em> air an fhaidhle seo.\n[[$1|thumb]]\nThoir sùil air an fhaidhle <strong>[[:$1]]</strong>.\nMas e an aon dealbh a tha san fhaidhle sin ach air meud tùsail, cha leig thu leas dealbhag a bharrachd a luchdadh suas.",
+ "file-thumbnail-no": "Tha ainm an fhaidhle a' tòiseachadh le <strong>$1</strong>.\nTha coltas an deilbh le meud lùghdaichte <em>(dealbhag)</em> air.\nMa tha an dealbh agad le dùmhlachd-bhreacaidh shlàn, feuch an luchdaich thu am fear ud suas 's mur eil, feuch an atharraich thu ainm an fhaidhle.",
+ "fileexists-forbidden": "Tha faidhle air a bheil an t-ainm seo ann mar-thà 's cha ghabh sgrìobhadh thairis air.\nMa tha thu airson am faidhle agad a luchdadh suas fhathast, rach air ais 's cleachd ainm ùr.\n[[File:$1|thumb|center|$1]]",
+ "fileexists-shared-forbidden": "Tha faidhle air a bheil an t-ainm seo ann mar-thà ann an ionad-tasgaidh nam faidhlichean co-roinnte.\nMa tha thu airson am faidhle agad a luchdadh suas fhathast, rach air ais 's cleachd ainm ùr.\n[[File:$1|thumb|center|$1]]",
+ "file-exists-duplicate": "Is dùblachadh {{PLURAL:$1| dhen fhaidhle| dhe na faidhlichean}} a leanas a tha san fhaidhle seo:",
+ "file-deleted-duplicate": "Chaidh faidhle a tha co.ionnann ris an fhear seo ([[:$1]]) a sguabadh às roimhe.\nThoir sùil air eachdraidh sguabaidh às an fhaidhle ud mus luchdaich thu suas a-rithist e.",
+ "file-deleted-duplicate-notitle": "Chaidh faidhle a tha co-ionnann ris an fhear seo a sguabadh às roimhe 's chaidh an tiotal a th' air a mhùchadh.\nBu coir dhut faighneachd air cuideigin a chì dàta faidhle mùchte ach an toir e sùil air an t-suidheachadh mus luchdaich thu suas a-rithist e.",
+ "uploadwarning": "Rabhadh luchdaidh suas",
+ "uploadwarning-text": "Atharraich tuairisgeul an fhaidhle gu h-ìosal 's feuch ris a-rithist.",
"savefile": "Sàbhail faidhle",
"uploadedimage": "a luchdaich suas \"[[$1]]\"",
+ "overwroteimage": "luchdaich suas tionndadh ùr de \"[[$1]]\"",
+ "uploaddisabled": "Tha an luchdadh suas à comas.",
+ "copyuploaddisabled": "Tha an luchdadh suas o URL à comas.",
+ "uploaddisabledtext": "Tha luchdadh suas fhaidhlichean à comas.",
+ "php-uploaddisabledtext": "Tha luchdadh suas fhaidhlichean à comas ann am PHP.\nThoir sùil air an roghainn file_uploads.",
+ "uploadscripted": "Tha còd HTML no sgriobt san fhaidhle seo a b' urrainn do bhrabhsair-lìn a ruith le mearachd.",
+ "uploadscriptednamespace": "Tha ainm-spàs \"$1\" mì-dhligheach san fhaidhle SVG seo.",
+ "uploadinvalidxml": "Cha b' urrainn dhuinn an XML san fhaidhle air a luchdadh suas a pharsadh.",
+ "uploadvirus": "Tha bhìoras san fhaidhle!\nFiosrachadh: $1",
+ "uploadjava": "Tha am faidhle seo 'na fhaidhle ZIP sa bheil faidhle .class Java.\nChan fhaod thu faidhlichean Java a luchdadh suas on a b' urrainn dhaibh cuingeachaidhean na tèarainteachd a leigeil seachad.",
+ "upload-source": "Am faidhle tùsail:",
+ "sourcefilename": "Ainm an fhaidhle thùsail:",
+ "sourceurl": "An URL tùsail:",
+ "destfilename": "Ainm an fhaidhle-uidhe:",
+ "upload-maxfilesize": "Meud as motha an fhaidhle: $1",
+ "upload-description": "Tuairisgeul an fhaidhle",
+ "upload-options": "Roghainnean an luchdaidh duas",
+ "watchthisupload": "Cum sùil air an fhaidhle seo",
+ "filewasdeleted": "Chaidh faidhle air a bheil an t-ainm seo a luchdadh suas roimhe 's a sguabadh às an uairsin.\nBu chòir dhut sùil a thoirt air $1 mur luchdaich thu suas e a-rithist.",
+ "filename-bad-prefix": "Tha ainm an fhaidhle a tha thu a' luchdadh suas a' tòiseachadh le <strong>\"$1\"</strong> na tha 'na ainm fhaidhle gun mhìneachadh a chruthaicheas camara digiteach gu fèin-obrachail mar as trice.\nFeuch an tagh thu ainm eile airson an fhaidhle agad a mhìnicheas dè th' ann.",
+ "filename-prefix-blacklist": " #<!-- fàg an loidhne seo dìreach mar a tha i --> <pre>\n# Seo an co-chàradh:\n# * 'Se facal-mìneachaidh a th' anns gach rud on charactar \"#\" gu deireadh na loidhne\n# * Tha gach loidhne nach eil bàn 'na ro-leasachan airson ainm faidhle àbhaisteach a thèid a thoirt seachad le camara digiteach gu fèin-obrachail\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # cuid a dh'fhònaichean-làimhe\nIMG # coitcheann\nJD # Jenoptik\nMGP # Pentax\nPICT # measgaichte\n #</pre> <!-- fàg an loidhne seo dìreach mar a tha i -->",
+ "upload-success-subj": "Shoirbhich leis an luchdadh suas",
+ "upload-success-msg": "Shoirbhich leis an luchdadh suas agad o [$2]. Seo far a bheil e ri làimh: [[:{{ns:file}}:$1]]",
+ "upload-failure-subj": "Duilgheadas leis an luchdadh suas",
+ "upload-failure-msg": "Thachair duilgheadas leis an luchdadh suas agad o [$2]:\n\n$1",
+ "upload-warning-subj": "Rabhadh luchdaidh suas",
+ "upload-warning-msg": "Thachair duilgheadas leis an luchdadh suas agad o [$2]. 'S urrainn dhut tilleadh gu [[Special:Upload/stash/$1|foirm an luchdaidh suas]] gus an duilgheadas seo a chàradh.",
+ "upload-proto-error": "Pròtacal nach eil mar bu chòir",
+ "upload-proto-error-text": "Iarraidh an luchdadh suas cèin URLan a thòisicheas le <code>http://</code> no <code>ftp://</code>.",
+ "upload-file-error": "Mearachd inntearnail",
+ "upload-file-error-text": "Thachair mearachd inntearnail fhad 's a bha sinn a' feuchainn ri faidhle sealach a chruthachadh air an fhrithealaiche.\nAn cuir thu fios gu [[Special:ListUsers/sysop|rianaire]]?",
+ "upload-misc-error": "Mearachd neo-aithnichte leis an luchdadh suas",
+ "upload-misc-error-text": "Thachair mearachd neo-aithnichte rè an luchdaidh suas\nDearbhaich gu bheil an URL dligheach 's gun gabh a ruigsinn 's feuch ris a-rithist.\nMa mhaireas an duilgheadas, cuir fios gu [[Special:ListUsers/sysop|rianaire]].",
+ "upload-too-many-redirects": "Bha cus ath-stiùiridhean am broinn an URL",
+ "upload-http-error": "Thachair mearachd HTTP: $1",
+ "upload-copy-upload-invalid-domain": "Chan eil luchdaidhean suas le lethbhreac ri làimh on àrainn seo.",
+ "backend-fail-stream": "Cha b' urrainn dhuinn am faidhle \"$1\" a shruthadh.",
+ "backend-fail-backup": "Cha b' urrainn dhuinn lethbhreac-glèidhidh a dhèanamh dhen fhaidhle \"$1\".",
+ "backend-fail-notexists": "Chan eil am faidhle $1 ann.",
+ "backend-fail-hashes": "Cha b' urrainn dhuinn hais nam faidhlichean fhaighinn gus an coimeas.",
+ "backend-fail-notsame": "Cha faidhle air \"$1\" ann mar-thà nach eil co-ionnann.",
+ "backend-fail-invalidpath": "Chan e \"$1\" 'na slighe stòraidh dligheach.",
+ "backend-fail-delete": "Cha b' urrainn dhuinn am faidhle \"$1\" a sguabadh às.",
+ "backend-fail-describe": "cha b' urrainn dhuinn am meata-dàta atharrachadh airson an fhaidhle \"$1\".",
+ "backend-fail-alreadyexists": "Tha am faidhle \"$1\" ann mar-thà.",
+ "backend-fail-store": "Cha b' urrainn dhuinn am faidhle \"$1\" a stòradh air \"$2\".",
+ "backend-fail-copy": "Cha b' urrainn dhuinn lethbhreac dhen fhaidhle \"$1\" a chur gu \"$2\".",
+ "backend-fail-move": "Cha b' urrainn dhuinn am faidhle \"$1\" a ghluasad gu \"$2\".",
+ "backend-fail-opentemp": "Cha deach leinn faidhle sealach a fhosgladh.",
+ "backend-fail-writetemp": "Cha deach leinn sgrìobhadh san fhaidhle sealach.",
+ "backend-fail-closetemp": "Cha deach leinn am faidhle sealach a dhùnadh.",
+ "backend-fail-read": "Cha b' urrainn dhuinn am faidhle \"$1\" a leughadh.",
+ "backend-fail-create": "Cha b' urrainn dhuinn sgrìobhadh san fhaidhle \"$1\".",
+ "backend-fail-maxsize": "Cha b' urrainn dhuinn am faidhle \"$1\" a sgrìobhadh on a tha e nas motha na $2 {{PLURAL:$2|bhaidht|bhaidht|baidhtichean|baidht}}.",
+ "backend-fail-readonly": "Chan eil backend an stòraidh \"$1\" ach ri leughadh a-mhàin an-dràsta. Seo as adhbhar: \"<em>$2</em>\"",
+ "backend-fail-synced": "Cha am faidhle \"$1\" ann an staid mì-chòrdail a thaobh nam backends stòraidh inntearnail.",
+ "backend-fail-connect": "Cha deach leinn ceangal ri backend an stòraidh \"$1\".",
+ "backend-fail-internal": "Chathair mearachd neo-aithnichte le backend an stòraidh \"$1\".",
+ "backend-fail-contenttype": "Cha deach leinn faighinn a-mach dè an seòrsa susbaint a tha san fhaidhle ri stòradh air \"$1\".",
+ "backend-fail-batchsize": "Chaidh batch de $1 {{PLURAL:$1|obrachadh|obrachadh|obrachaidhean|obrachadh}} faidhle a thoirt gu backend an stòraidh; chan eil ach $2 {{PLURAL:$2|obrachadh|obrachadh|obrachaidhean|obrachadh}} ceadaiche air a char as motha.",
+ "backend-fail-usable": "Cha deach leinn am faidhle \"$1\" a leughadh no a sgrìobhadh ann on a bheil cead no pasgan/soitheach a dhìth.",
+ "filejournal-fail-dbconnect": "Cha deach leinn ceangal ris an stòr-dàta leabhair-latha airson backend an stòrais \"$1\".",
+ "filejournal-fail-dbquery": "Cha deach leinn an stòr-dàta leabhair-latha airson backend an stòrais \"$1\" ùrachadh.",
+ "lockmanager-notlocked": "Cha deach leinn a' ghlas a thoirt far \"$1\" o nach eil e glaiste.",
+ "lockmanager-fail-closelock": "Cha deach leinn am faidhle glasaidh airson \"$1\" a dhùnadh.",
+ "lockmanager-fail-deletelock": "Cha deach leinn am faidhle glasaidh airson \"$1\" a sguabadh às.",
+ "lockmanager-fail-acquirelock": "Cha deach leinn a' ghlas fhaighinn airson \"$1\".",
+ "lockmanager-fail-openlock": "Cha deach leinn am faidhle glasaidh airson \"$1\" fhosgladh.",
+ "lockmanager-fail-releaselock": "Cha deach leinn a' ghlas fhosgladh airson \"$1\".",
+ "lockmanager-fail-db-bucket": "Cha deach leinn conaltradh ris na dh'fhoghnadh de stòran-dàta glasaidh sa bhucaid $1.",
+ "lockmanager-fail-db-release": "Cha deach leinn na glasan fhosgladh air an stòr-dàta $1.",
+ "lockmanager-fail-svr-acquire": "Cha deach leinn na glasan fhaighinn air an fhrithealaiche \"$1\".",
+ "lockmanager-fail-svr-release": "Cha deach leinn na glasan fhosgladh air an fhrithealaiche \"$1\".",
+ "zip-file-open-error": "Thachair mearachd le fosgladh an fhaidhle airson dearbhadh ZIP.",
+ "zip-wrong-format": "Chan eil am faidhle sònraichte 'na fhaidhle ZIP.",
+ "zip-bad": "Tha am faidhle ZIP coirbte no cha ghabh a leughadh air adhbhar eile air choireigin.\nChan urrainn dhuinn dearbhadh mar bu chòir a bheil e tèarainte gus nach eil.",
+ "zip-unsupported": "Tha am faidhle ZIP seo a' chleachdadh feartan ZIP ris nach cuir MediaWiki taic.\nChan urrainn dhuinn dearbhadh mar bu chòir a bheil e tèarainte gus nach eil.",
+ "uploadstash": "Tasgadan an luchdaidh suas",
+ "uploadstash-clear": "Glan na faidhlichean ann an tasgadan an luchdaidh suas",
+ "uploadstash-nofiles": "Chan eil faidhle agad ann an tasgadan an luchdaidh suas.",
"license": "Ceadachadh:",
"license-header": "Ceadachadh",
"nolicense": "Cha deach gin a thaghadh",
+ "license-nopreview": "(Chan eil ro-shealladh ri làimh)",
+ "upload_source_url": "(URL dligheach a ghabhas inntrigeadh gu poblach)",
+ "upload_source_file": "(faidhle air a' choimpiutair agad)",
+ "listfiles-summary": "Seallaidh an duilleag shònraichte seo gach faidhle a chaidh a luchdadh suas.",
+ "listfiles_search_for": "Lorg airson ainm a' mheadhain:",
+ "imgfile": "faidhle",
"listfiles": "Liosta nan ìomhaigh",
- "file-anchor-link": "Ìomhaigh",
+ "listfiles_thumb": "Dealbhag",
+ "listfiles_date": "Ceann-là",
+ "listfiles_name": "Ainm",
+ "listfiles_user": "Cleachdaiche",
+ "listfiles_size": "Meud",
+ "listfiles_description": "Tuairisgeul",
+ "listfiles_count": "Tionndaidhean",
+ "listfiles-show-all": "Gabh a-steach seann-tionndaidhean de dhealbhan",
+ "listfiles-latestversion": "An tionndadh làithreach",
+ "listfiles-latestversion-yes": "Tha",
+ "listfiles-latestversion-no": "Chan eil",
+ "file-anchor-link": "Faidhle",
"filehist": "Eachdraidh an fhaidhle",
- "filehist-help": "Briog air ceann-là/àm gus am faidhle fhaicinn mar a nochd e aig an àm sin.",
+ "filehist-help": "Briog air ceann-là/àm gus am faidhle a shealltainn mar a nochd e aig an àm sin.",
+ "filehist-deleteall": "sguab às na h-uile",
+ "filehist-deleteone": "sguab às",
"filehist-revert": "till",
"filehist-current": "làithreach",
"filehist-datetime": "Ceann-là/Àm",
- "filehist-thumb": "Meanbh-dhealbh",
- "filehist-thumbtext": "Meanbh-dhealbh airson an tionndaidh on $1",
- "filehist-user": "Neach-cleachdaidh",
+ "filehist-thumb": "Dealbhag",
+ "filehist-thumbtext": "Dealbhag airson an tionndaidh on $1",
+ "filehist-nothumb": "Gun dealbhag",
+ "filehist-user": "Cleachdaiche",
"filehist-dimensions": "Meud",
"filehist-comment": "Beachd",
"imagelinks": "Cleachdadh an fhaidhle",
- "linkstoimage": "Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas a' ceangal ris an fhaidhle seo:",
+ "linkstoimage": "Tha ceangal ris an fhaidhle seo {{PLURAL:$1|san duilleag|sna duilleagan}} a leanas:",
+ "linkstoimage-more": "Tha ceangal ris an fhaidhle seo ann am barrachd air $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}}.\nCha sheall an liosta a leanas ach a' chiad $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}} sa bheil ceangal ris an fhaidhle seo.\nTha [[Special:WhatLinksHere/$2|liosta shlàn]] ri fhaighinn.",
"nolinkstoimage": "Chan eil duilleag sam bith a' ceangal an-seo.",
+ "morelinkstoimage": "Seall [[Special:WhatLinksHere/$1|barrachd cheanglaichean]] gun fhaidhle seo.",
+ "linkstoimage-redirect": "$1 (ath-stiùireadh faidhle) $2",
+ "duplicatesoffile": "Tha {{PLURAL:$1|an $1 faidhle a leanas 'na dhùblachadh|an $1 fhaidhle a leanas 'nan dùblachadh|na $1 faidhlichean a leanas 'nan dùblachadh|am $1 faidhle a leanas 'nan dùblachadh}} dhen fhaidhle seo ([[Special:FileDuplicateSearch/$2|barrachd fiosrachaidh]]):",
"sharedupload": "Tha am faidhle seo o $1 agus faodaidh pròiseactan eile a chleachdadh.",
- "sharedupload-desc-here": "'S ann à $1 a tha am faidhle seo agus faodaidh gu bheil pròiseactan eile 'ga chleachdadh.\nChithear an tuairisgeul a tha aice air [duilleag tuairisgeul an fhaidhle $2] gu h-ìosal.",
+ "sharedupload-desc-there": "'S ann à $1 a tha am faidhle seo agus faodaidh gu bheil pròiseactan eile 'ga chleachdadh.\nFaic [duilleag tuairisgeul an fhaidhle $2] airson barrachd fiosrachaidh.",
+ "sharedupload-desc-here": "'S ann à $1 a tha am faidhle seo agus faodaidh gu bheil pròiseactan eile 'ga chleachdadh.\nChì thu an tuairisgeul a tha aice air [duilleag tuairisgeul an fhaidhle $2] gu h-ìosal.",
+ "sharedupload-desc-edit": "'S ann à $1 a tha am faidhle seo agus faodaidh gu bheil pròiseactan eile 'ga chleachdadh.\n'S dòcha gu bheil thu airson an tuairisgeul a tha aice a dheasachadh air [duilleag tuairisgeul an fhaidhle $2].",
+ "sharedupload-desc-create": "'S ann à $1 a tha am faidhle seo agus faodaidh gu bheil pròiseactan eile 'ga chleachdadh.\n'S dòcha gu bheil thu airson an tuairisgeul a tha aice a dheasachadh air [duilleag tuairisgeul an fhaidhle $2].",
+ "filepage-nofile": "Chan eil faidhle air a bheil an t-ainm seo ann.",
+ "filepage-nofile-link": "Chan eil faidhle air a bheil an t-ainm seo ann ach 's urrainn dhut [$1 fear a luchdadh suas].",
"uploadnewversion-linktext": "Luchdaich suas tionndadh ùr dhen fhaidhle seo",
+ "shared-repo-from": "o $1",
+ "shared-repo": "ionad-tasgaidh co-roinnte",
+ "shared-repo-name-wikimediacommons": "Wikimedia Commons",
+ "filepage.css": "/* Thèid an CSS a chuireas tu an-seo a ghabhail a-steach air duilleag tuairisgeul an fhaidhle 's air uicidhean aig cliantan cèine */",
+ "upload-disallowed-here": "Chan urrainn dhut sgrìobhadh thairis air an fhaidhle seo.",
+ "filerevert": "Till $1",
+ "filerevert-legend": "Till am faidhle",
+ "filerevert-intro": "Tha thu an impis am faidhle <strong>[[Media:$1|$1]]</strong> a thilleadh dhan [$4 tionndadh on $2 $3].",
+ "filerevert-comment": "Adhbhar:",
+ "filerevert-defaultcomment": "Air a thilleadh gun tionndadh on $1 $2",
+ "filerevert-submit": "Till",
+ "filerevert-success": "Chaidh <strong>[[Media:$1|$1]]</strong> a thilleadh gun [$4 tionndadh on $2 $3].",
+ "filerevert-badversion": "Chan eil tionndadh ionadail an fhaidhle ann air a bheil an stampa-tìde a chaidh a thoirt seachad.",
+ "filedelete": "Sguab às $1",
+ "filedelete-legend": "Sguab às am faidhle",
+ "filedelete-intro": "Tha thu an impis am faidhle <strong>[[Media:$1|$1]]</strong> a sguabadh às cho math ris an eachdraidh shlàn aige.",
+ "filedelete-intro-old": "Tha thu a' sguabadh às an tionndadh de <strong>[[Media:$1|$1]]</strong> on [$4 $2 $3].",
+ "filedelete-comment": "Adhbhar:",
+ "filedelete-submit": "Sguab às",
+ "filedelete-success": "Chaidh <strong>$1</strong> a sguabadh às.",
+ "filedelete-success-old": "Chaidh an tionndadh de <strong>[[Media:$1|$1]]</strong> on $2 $3 a sguabadh às.",
+ "filedelete-nofile": "Chan eil <strong>$1</strong> ann.",
+ "filedelete-nofile-old": "Chan eil tionndadh de <strong>$1</strong> san tasglann air a bheil na buadhan sònraichte.",
+ "filedelete-otherreason": "Adhbhar eile/a bharrachd:",
+ "filedelete-reason-otherlist": "Adhbhar eile",
"filedelete-reason-dropdown": "*Adhbharan cumanta airson sguabadh às\n** Tha e a' briseadh na còrach-lethbhreac\n** Faidhle air a dhùblachadh",
- "randompage": "Duilleag thuairmeach",
- "statistics": "Staitistearachd",
+ "filedelete-edit-reasonlist": "Deasaich adhbharan an sguabaidh às",
+ "filedelete-maintenance": "Chaidh sguabadh às 's aiseag nam faidhlichean a chur à comas rè obair-glèidhidh gu sealach.",
+ "filedelete-maintenance-title": "Cha ghabh am faidhle a sguabadh às",
+ "mimesearch": "Lorg MIME",
+ "mimesearch-summary": "Leigidh an duilleag seo leat faidhlichean a chriathradh a-rèir an t-seòrsa MIME a th' orra.\nIon-chur: seòrsa-na-susbainte/fo-sheòrsa, m.e. <code>image/jpeg</code>.",
+ "mimetype": "Seòrsa MIME:",
+ "download": "luchdaich a-nuas",
+ "unwatchedpages": "Duilleagan air an toirt far a' chlàir-fhaire",
+ "listredirects": "Liosta nan ath-stiùiridhean",
+ "listduplicatedfiles": "Liosta nam faidhlichean aig a bheil dùblachadh",
+ "listduplicatedfiles-summary": "Seo liosta nam faidhlichean 's an tionndadh as ùire dhiubh 'na dhùblachadh aig an tionndadh as ùire de dh'fhaidhle air choireigin eile. Chan fhaic thu ach faidhlichean ionadail.",
+ "listduplicatedfiles-entry": "Tha $2 [[$3|{{PLURAL:$2|dùblachadh|dhùblachadh|dùblachaidhean|dùblachadh}}]] aig [[:File:$1|$1]].",
+ "unusedtemplates": "Teamplaidean gun chleachdadh",
+ "unusedtemplatestext": "Seallaidh an duilleag seo a h-uile duilleag dhut a tha san ainm-spàs {{ns:template}} 's nach deach a ghabhail a-steach ann an duilleag eile.\nThoir an aire gum b' fheairrde thu sùil a thoirt airson ceanglaichean eile dha na teamplaidean mus sguab thu às dhaibh.",
+ "unusedtemplateswlh": "ceanglaichean eile",
+ "randompage": "Duilleag air thuaiream",
+ "randompage-nopages": "Chan eil duilleag {{PLURAL:$2|san ainm-spàs|sna h-ainm-spàsan}} a leanas: $1.",
+ "randomincategory": "Duilleag air thuaiream san roinn-seòrsa",
+ "randomincategory-invalidcategory": "Chan e \"$1\" 'na ainm roinn-seòrsa dligheach.",
+ "randomincategory-nopages": "Chan eil duilleag san roinn-seòrsa [[:Category:$1|$1]].",
+ "randomincategory-selectcategory": "Faigh duilleag air thuaiream a tha san roinn-seòrsa: $1 $2.",
+ "randomincategory-selectcategory-submit": "Siuthad",
+ "randomredirect": "Ath-stiùireadh air thuaiream",
+ "randomredirect-nopages": "Chan eil ath-stiùireadh san ainm-spàs \"$1\".",
+ "statistics": "Stadastaireachd",
+ "statistics-header-pages": "Stadastaireachd nan duilleagan",
+ "statistics-header-edits": "Deasaich an stadastaireachd",
+ "statistics-header-views": "Seall an stadastaireachd",
+ "statistics-header-users": "Stadastaireachd a' chleachdaiche",
+ "statistics-header-hooks": "Stadastaireachd eile",
+ "statistics-articles": "Duilleagan susbainte",
+ "statistics-pages": "Duilleagan",
+ "statistics-pages-desc": "A h-uile duilleag san uicidh, a' gabhail a-steach nan duilleagan deasbaireachd, ath-stiùiridhean agus msaa.",
+ "statistics-files": "Faidhlichean a chaidh a luchdadh suas",
+ "statistics-edits": "Deasachaidhean air duilleagan on a chaidh {{SITENAME}} a stèidheachadh",
+ "statistics-edits-average": "Deasachaidhean cuibheasach air duilleag",
+ "statistics-views-total": "Seallaidhean iomlan",
+ "statistics-views-total-desc": "Chan fhaic thu na seallaidhean air duilleagan nach eil ann no air duilleag shònraichte",
+ "statistics-views-peredit": "Seallaidhean air gach deasachadh",
+ "statistics-users": "[[Special:ListUsers|Cleachdaichean]] clàraichte",
+ "statistics-users-active": "Cleachdaichean gnìomhach",
+ "statistics-users-active-desc": "Cleachdaichean a rinn gnìomh rè {{PLURAL:$1|an $1 latha|an $1 latha|nan $1 làithean|an $1 latha}} mu dheireadh",
+ "statistics-mostpopular": "Na duilleagan air an deach sealltainn as trice",
+ "pageswithprop": "Duilleagan le buadh duilleige",
+ "pageswithprop-legend": "Duilleagan le buadh duilleige",
+ "pageswithprop-text": "Seallaidh an duilleag seo duilleagan dhut air a bheil buadh duilleige shònraichte.",
+ "pageswithprop-prop": "Ainm na buaidhe:",
+ "pageswithprop-submit": "Siuthad",
+ "pageswithprop-prophidden-long": "chaidh luach fada aig buadh teacsa fhalach ($1)",
+ "pageswithprop-prophidden-binary": "chaidh luach bìnearaidh fhalach ($1)",
"doubleredirects": "Ath-seòlaidhean dùbailte",
- "brokenredirects": "Ath-stiùireidhean briste",
- "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
+ "double-redirect-fixed-move": "Chaidh [[$1]] a ghluasad.\nChaidh ùrachadh gu fèin-obrachail 's nì e ath-stiùireadh gu [[$2]] a-nis.",
+ "double-redirect-fixed-maintenance": "A' càradh ath-stiùireadh dùblaichte o [[$1]] gu [[$2]] gu fèin-obrachail le obair-càraidh.",
+ "double-redirect-fixer": "Càraichear nan ath-stiùiridhean",
+ "brokenredirects": "Ath-stiùiridhean briste",
+ "brokenredirectstext": "Nì na h-ath-stiùiridhean seo ceangal gu duilleag nach eil ann:",
+ "brokenredirects-edit": "deasaich",
+ "brokenredirects-delete": "sguab às",
+ "withoutinterwiki": "Duilleagan gun cheangal cànain",
+ "withoutinterwiki-summary": "Cha dèan na duilleagan seo ceangal gun tionndadh aig cànan eile:",
+ "withoutinterwiki-legend": "Ro-leasachan",
+ "withoutinterwiki-submit": "Seall",
+ "fewestrevisions": "Duilleagan air a bheil an àireamh as lugha de mhùthaidhean",
+ "nbytes": "$1 {{PLURAL:$1|bhaidht|bhaidht|baidhtichean|baidht}}",
+ "ncategories": "$1 {{PLURAL:$1|roinn-seòrsa|roinn-seòrsa|roinnean-seòrsa|roinn-seòrsa}}",
+ "ninterwikis": "$1 {{PLURAL:$1|eadar-uicidh|eadar-uicidhean}}",
+ "nlinks": "$1 {{PLURAL:$1|cheangal|cheangal|ceanglaichean|ceangal}}",
"nmembers": "$1 {{PLURAL:$1|bhall|bhall|buill|ball}}",
+ "nmemberschanged": "$1 → $2 {{PLURAL:$2|bhall|bhall|buill|ball}}",
+ "nrevisions": "$1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}",
"nviews": "$1 {{PLURAL:$1|sealladh|shealladh|seallaidhean|sealladh}}",
+ "nimagelinks": "'Ga chleachdadh air $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}}",
+ "ntransclusions": "'ga chleachdadh air $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}}",
+ "specialpage-empty": "Chan eil toradh ann airson na h-aithris seo.",
+ "lonelypages": "Duilleagan 'nan dìlleachdan",
+ "lonelypagestext": "Chan eil ceangal gu na duilleagan seo o dhuilleag eile no an gabhail a-steach 'nan iomradh ann an duilleag eile air {{SITENAME}}.",
"uncategorizedpages": "Duilleagan gun roinn-seòrsa",
"uncategorizedcategories": "Roinnean-seòrsa gun roinn-seòrsa",
+ "uncategorizedimages": "Faidhlichean gun roinn-seòrsa",
+ "uncategorizedtemplates": "Teamplaidean gun roinn-seòrsa",
+ "unusedcategories": "Roinnean-seòrsa gun chleachdadh",
"unusedimages": "Faidhlichean gun chleachdadh",
+ "popularpages": "Duilleagan air a bheil fèill mhòr",
+ "wantedcategories": "Roinnean-seòrsa a thathar 'gan iarraidh",
+ "wantedpages": "Duilleagan a thathar 'gan iarraidh",
+ "wantedpages-badtitle": "Tha tiotal mì-dhligheach am measg nan toraidhean: $1",
+ "wantedfiles": "Faidhlichean a thathar 'gan iarraidh",
+ "wantedtemplates": "Teamplaidean a thathar 'gan iarraidh",
+ "mostlinked": "Na duilleagan ris a bheil an àireamh as motha de cheanglaichean",
+ "mostlinkedcategories": "Na roinnean-seòrsa ris a bheil an àireamh as motha de cheanglaichean",
+ "mostlinkedtemplates": "Na duilleagan a chaidh a ghabhal a-steach 'nan iomradh an àireamh as motha",
+ "mostcategories": "Na duilleagan aig a bheil an àireamh as motha de roinnean-seòrsa",
+ "mostimages": "Na faidhlichean ris a bheil an àireamh as motha de cheanglaichean",
+ "mostinterwikis": "Na duilleagan aig a bheil an àireamh as motha de eadar-uicidhean",
+ "mostrevisions": "Duilleagan air a bheil an àireamh as motha de mhùthaidhean",
"prefixindex": "A h-uile duilleag le ro-leasachan",
+ "prefixindex-namespace": "A h-uile duilleag le ro-leasachan (ainm-spàs $1)",
+ "prefixindex-strip": "Ro-leasachan sreinge air an liosta",
"shortpages": "Duilleagan goirid",
"longpages": "Duilleagan fada",
+ "deadendpages": "Duilleagan cùile-dùinte",
+ "deadendpagestext": "Cha dèan na duilleagan seo ceangal gu duilleag sam bith eile air {{SITENAME}}.",
+ "protectedpages": "Duilleagan fo dhìon",
+ "protectedpages-indef": "Dìonan buana a-mhàin",
+ "protectedpages-cascade": "Dìonan o bhith mar eas a-mhàin",
"listusers": "Liosta nan cleachdaichean",
- "usercreated": "Air a chruthachadh le {{GENDER:$3|}} $1 aig $2",
+ "usereditcount": "$1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}}",
+ "usercreated": "Air a chruthachadh $1 $2",
"newpages": "Duilleagan ùra",
+ "newpages-username": "Ainm-cleachdaiche:",
"ancientpages": "Duilleagan as sìne",
"move": "Gluais",
"movethispage": "Gluais an duilleag seo",
- "pager-newer-n": "{{PLURAL:$1|1 nas ùire|$1 nas ùire}}",
- "pager-older-n": "{{PLURAL:$1|1 nas sine|$1 nas sine}}",
+ "unusedcategoriestext": "Tha na duilleagan roinn-seòrsa seo ann ged nach cleachd duilleag no roinn-seòrsa sam bith eile iad.",
+ "pager-newer-n": "{{PLURAL:$1|an $1 nas ùire|na $1 nas ùire}}",
+ "pager-older-n": "{{PLURAL:$1|an $1 nas sine|na $1 nas sine}}",
+ "suppress": "Marasgal",
"booksources": "Tùsan a tha 'nan leabhraichean",
"booksources-search-legend": "Lorg tùsan a tha 'nan leabhraichean",
"booksources-go": "Siuthad",
"allpagesfrom": "Seall duilleagan a tha a' tòiseachadh aig:",
"allpagesto": "Seall duilleagan a tha a' crìochnachadh aig:",
"allarticles": "A h-uile duilleag",
+ "allinnamespace": "A h-uile duilleag (ainm-spàs $1)",
"allpagessubmit": "Rach",
+ "allpages-bad-ns": "Chan eil an t-ainm-spàs \"$1\" aig {{SITENAME}}.",
"categories": "Roinnean-seòrsa",
- "categoriespagetext": "Tha duilleagan no meadhan {{PLURAL:$1|san roinn-seòrsa|sna roinntean-seòrsa|}} a leanas.\nChan fhaicear [[Special:UnusedCategories|roinntean-seòrsa gun chleachdadh an-seo]].\nThoir sùil air na [[Special:WantedCategories|roinntean-seòrsa a thathar 'gan iarraidh cuideachd]].",
- "deletedcontributions": "Obair a' chleachdaiche a chaidh a sguabadh às",
+ "categoriespagetext": "Tha duilleagan no meadhan {{PLURAL:$1|san roinn-seòrsa|sna roinnean-seòrsa|}} a leanas.\nChan fhaicear [[Special:UnusedCategories|roinnean-seòrsa gun chleachdadh an-seo]].\nThoir sùil air na [[Special:WantedCategories|roinnean-seòrsa a thathar 'gan iarraidh cuideachd]].",
+ "categoriesfrom": "Seall roinnean-seòrsa a tha a' tòiseachadh aig:",
+ "deletedcontributions": "Obair air a sguabadh às",
+ "deletedcontributions-title": "Obair air a sguabadh às",
+ "sp-deletedcontributions-contribs": "obair",
"linksearch": "Lorg sna ceanglaichean dhan taobh a-muigh",
- "linksearch-ns": "Namespace:",
+ "linksearch-ns": "Ainm-spàs:",
"linksearch-line": "Tha $1 a' ceangal an-seo o $2",
+ "listgrouprights-key": "Treòir:\n* <span class=\"listgrouprights-granted\">Cead a fhuair iad</span>\n* <span class=\"listgrouprights-revoked\">Cead air a thoirt uapa</span>",
"listgrouprights-members": "(liosta de bhuill)",
+ "listgrouprights-namespaceprotection-header": "Cuingeachaidhean air ainm-spàs",
+ "listgrouprights-namespaceprotection-namespace": "Ainm-spàs",
+ "trackingcategories": "Roinnean-seòrsa tracaidh",
+ "trackingcategories-summary": "Chì thu na roinnean-seòrsa tracaidh air an duilleag seo a thèid a chur riutha gu fèin-obrachail leis a' bhathar-bhog MediaWiki. 'S urrainn dhut na h-ainmean a tha orra atharrachadh 's tu ag atharrachadh teachdaireachdan an t-siostaim iomchaidh san ainm-spàs {{ns:8}}.",
+ "trackingcategories-msg": "Roinn-seòrsa tracaidh",
+ "trackingcategories-desc": "Cuspairean-deuchainn gus roinnean-seòrsa a chur ris",
+ "noindex-category-desc": "Cha dèid an duilleag seo a chur ris an inneacs luirg le botaichean on a tha am facal draoidheach <code><nowiki>__NOINDEX__</nowiki></code> air 's a tha i ann an ainm-spàs far a bheil a' bhratach seo ceadaichte.",
+ "index-category-desc": "Tha <code><nowiki>__INDEX__</nowiki></code> air an duilleag seo ('s tha i ann an ainm-spàs far a bheil a' bhratach seo ceadaichte) 's mar sin thèid a chur ri inneacsan luirg le botaichean ged nach tachradh seo gu h-àbhaisteach.",
+ "broken-file-category-desc": "Thèid an roinn-seòrsa seo a chur ris nuair a bhios ceangal gu faidhle briste am broinn na duilleige (ceangal gus faidhle a leabachadh mur eil am faidhle ann).",
+ "hidden-category-category-desc": "Seo ronn-seòrsa le <code><nowiki>__HIDDENCAT__</nowiki></code> oirre ach nach nochd i ann am bogsa nan ceanglaichean gu roinnean-seòrsa air na duilleagan o thùs.",
+ "trackingcategories-nodesc": "Chan eil tuairisgeul ri làimh.",
+ "trackingcategories-disabled": "Tha an roinn-seòrsa à comas",
"emailuser": "Cuir post-dealain dhan chleachdaiche seo",
+ "emailuser-title-target": "Cuir post-d dhan chleachdaiche seo",
"emailusername": "Ainm-cleachdaiche:",
"emailusernamesubmit": "Air adhart",
"emailfrom": "O:",
"mywatchlist": "An clàr-faire",
"watchlistfor2": "aig $1 $2",
"nowatchlist": "Chan eil rud sam bith air a' chlàr-fhaire agad.",
+ "watchlistanontext": "$1 gus nithean air a' chlàr-fhaire agad a shealltainn no a dheasachadh.",
"addwatch": "Cuir air a' chlàr-fhaire",
"addedwatchtext": "Chaidh an duilleag \"[[:$1]]\" a chur ri [[Special:Watchlist|do chlàr-faire]].\nNochdaidh mùthaidhean a nithear air an duilleag seo 's air an duilleag deasbaireachd a tha co-cheangailte ris an-seo san àm ri teachd.",
+ "addedwatchtext-short": "Chaidh an duilleag \"$1\" a chur ris a' chlàr-fhaire agad.",
"removewatch": "Thoir air falbh on chlàr-fhaire",
"removedwatchtext": "Chaidh an duilleag \"[[:$1]]\" a thoirt air falbh o [[Special:Watchlist|do chlàr-faire]].",
+ "removedwatchtext-short": "Chaidh an duilleag \"$1\" a thoirt ait falbh on chlàr-fhaire agad.",
"watch": "Cum sùil air",
"watchthispage": "Cum sùil air an duilleag seo",
- "unwatch": "Na cum sùil tuilleadh",
+ "unwatch": "Thoir far a' chlàir-fhaire",
"unwatchthispage": "Na cum sùil tuilleadh",
"notanarticle": "Chan e duilleag susbaint a tha ann",
+ "notvisiblerev": "Chaidh am mùthadh mu dheireadh le cleachdaiche eile a sguabadh às",
"watchlist-details": "Tha {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} air a' chlàr-fhaire agad, gun luaidh air na duilleagan deasbaireachd.",
- "wlheader-showupdated": "Tha clò '''trom''' air duilleagan a chaidh atharrachadh on turas mu dheireadh a thadhail thu orra.",
- "wlnote2": "Chì thu na h-atharraichean {{PLURAL:$1|san uair|san <strong>$1</strong> uair|san <strong>$1</strong> uair|san <strong>$1</strong> uair|sna <strong>$1</strong> uairean|sna <strong>$1</strong> uair}} a thìde seo chaidh aig $3 air $2.",
+ "wlheader-enotif": "Tha brathan-naidheachd air a' phost-d an comas.",
+ "wlheader-showupdated": "Tha clò <strong>trom</strong> air duilleagan a chaidh atharrachadh on turas mu dheireadh a thadhail thu orra.",
+ "wlnote2": "Chì thu na h-atharraichean {{PLURAL:$1|san <strong>$1</strong> uair|san <strong>$1</strong> uair|sna <strong>$1</strong> uairean|san <strong>$1</strong> uair}} a thìde seo chaidh aig $3 air $2.",
"wlshowlast": "Seall na $1 uairean a thìde mu dheireadh $2 làithean mu dheireadh $3",
"watchlist-options": "Roghainnean mo chlàir-faire",
"watching": "'Ga chur air a' chlàr-fhaire...",
"unwatching": "A' toirt far a' chlàir-fhaire...",
+ "watcherrortext": "Thachair mearachd le atharrachadh nan roghainnean airson \"$1\" airson a' chlàr-fhaire agad.",
"enotif_reset": "Comharraich gun do thadhladh air gach duilleag",
+ "enotif_impersonal_salutation": "Cleachdaiche {{SITENAME}}",
+ "enotif_subject_deleted": "Chaidh duilleag $1 air {{SITENAME}} a sguabadh às le $2",
+ "enotif_subject_created": "Chaidh duilleag $1 air {{SITENAME}} a chruthachadh le $2",
+ "enotif_subject_moved": "Chaidh duilleag $1 air {{SITENAME}} a ghluasad le $2",
+ "enotif_subject_restored": "Chaidh an duilleag $1 air {{SITENAME}} aiseag le $2",
+ "enotif_subject_changed": "Chaidh duilleag $1 air {{SITENAME}} atharrachadh le $2",
+ "enotif_body_intro_deleted": "Chaidh duilleag $1 air {{SITENAME}} a sguabadh às le $2 $PAGEEDITDATE, faic $3.",
+ "enotif_body_intro_created": "Chaidh duilleag $1 air {{SITENAME}} a chruthachadh le $2 $PAGEEDITDATE, faic $3 airson a' mhùthaidh làithrich.",
+ "enotif_body_intro_moved": "Chaidh duilleag $1 air {{SITENAME}} a ghluasad le $2 $PAGEEDITDATE, faic $3 airson a' mhùthaidh làithrich.",
+ "enotif_body_intro_restored": "Chaidh duilleag $1 air {{SITENAME}} aiseag le $2 $PAGEEDITDATE, faic $3 airson a' mhùthaidh làithrich.",
+ "enotif_body_intro_changed": "Chaidh duilleag $1 air {{SITENAME}} atharrachadh le $2 $PAGEEDITDATE, faic $3 airson a' mhùthaidh làithrich.",
+ "enotif_body": "$WATCHINGUSERNAME, a charaid,\n\n$PAGEINTRO $NEWPAGE\n\nGearr-chunntas an deasaiche: $PAGESUMMARY $PAGEMINOREDIT\n\nCuir fios gun deasaiche:\npost-d: $PAGEEDITOR_EMAIL\nuicidh: $PAGEEDITOR_WIKI\n\nChan fhaigh thu brath-naidheachd eile air gnìomhan ach ma thadhaileas tu air an duilleag 's tu air logadh a-steach. 'S urrainn dhut cuideachd brataich nam brathan-naidheachd aiseag airson nan duilleagan uile a tha air a' chlàr-fhaire agad.\n\nSiostam càirdeil nam brath aig {{SITENAME}}\n\n--\nGus roghainnean nam brathan a gheibh thu air a' phost-d atharrachadh, tadhail air\n{{canonicalurl:{{#special:Preferences}}}}\n\nGus roghainnean a' chlàir-fhaire agad atharrachadh, tadhail air\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nGus duilleagan a thoirt far a' chlàir-fhaire agad, tadhail air\n$UNWATCHURL\n\nBeachdan thugainn 's barrachd taice:\n$HELPPAGE",
"deletepage": "Sguab às duilleag",
"confirm": "Daingnich",
"excontent": "stuth a bh' ann: '$1'",
+ "excontentauthor": "b' e: \"$1\" an t-susbaint (is \"[[Special:Contributions/$2|$2]]\" an aon deasaiche)",
"delete-confirm": "Sguab às \"$1\"",
"delete-legend": "Sguab às",
+ "historywarning": "<strong>Rabhadh:</strong> Tha eachdraidh air an duilleag a tha thu airson sguabadh às sa bheil mu $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}:",
"confirmdeletetext": "Tha thu an impis duilleag a sguabadh às agus a h-eachdraidh uile gu lèir.\nDearbhaich gu bheil thu airson seo a dhèanamh 's gun tuig thu a' bhuaidh a bhios ann agus gu bheil thu a' dèanamh seo a-rèir [[{{MediaWiki:Policy-url}}|a' phoileasaidh]].",
"actioncomplete": "Gnìomh deiseil",
"actionfailed": "Dh'fhàillig ort",
"deletedtext": "Chaidh \"$1\" a sguabadh às.\nSeall air $2 airson clàr de dhuilleagan a chaidh a sguabadh às o chionn ghoirid.",
"dellogpage": "Loga an sguabaidh às",
- "reverted": "Air aiseag gu tionndadh nas sine",
+ "reverted": "Air aiseag gu mùthadh nas sine",
"deletecomment": "Adhbhar:",
"deleteotherreason": "Adhbhar eile/a bharrachd:",
"deletereasonotherlist": "Adhbhar eile",
"deletereason-dropdown": "*Adhbharan cumanta airson sguabadh às\n** Spama\n** Milleadh\n** Tha e a' briseadh na còrach-lethbhreac\n** Dh'iarr an t-ùghdar e\n** Ath-threòrachadh briste",
"delete-edit-reasonlist": "Deasaich adhbharan sguabadh às",
+ "delete-toobig": "Tha eachdraidh deasachaidh mòr aig an duilleag seo sa bheil barrachd air $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}.\nChaidh sguabadh às nan duilleagan dhen leithid a chuingeachadh ach na dèid cron a dhèanamh air {{SITENAME}} le mearachd.",
+ "delete-warning-toobig": "Tha eachdraidh deasachaidh mòr aig an duilleag seo sa bheil barrachd air $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}.\nMa sguabas tu às dhi, dh'fhaoidte gun dèan thu cron air na gnìomhan stòr-dàta aig {{SITENAME}}; mar sin, thoir an aire.",
+ "rollback": "Roilig atharraichean air ais",
+ "rollback_short": "Roladh air ais",
"rollbacklink": "roilig air ais",
+ "rollbacklinkcount": "roilig $1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}} air ais",
+ "rollbacklinkcount-morethan": "roilig barrachd air $1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}} air ais",
+ "rollbackfailed": "Dh'fhàillig leis an roladh air ais",
+ "cantrollback": "Cha ghabh na chaidh a dheasachadh a thilleadh;\nis an deasaiche mu dheireadh an aon ùghdar aig an duilleag seo.",
+ "alreadyrolled": "Cha ghabh an deasachadh mu dheireadh air [[:$1]] leis [[User:$2|$2]] ([[User talk:$2|an deasbaireachd]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) a roladh air ais on a rinn cuideigin eile deasachadh no roladh air ais air an duilleag mar-thà.\n\nChaidh an duilleag a dheasachadh an turas mu dheireadh leis [[User:$3|$3]] ([[User talk:$3|an deasbaireachd]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
"editcomment": "Seo gearr-chunntas an deasachaidh: \"''$1''\".",
- "revertpage": "Deasachaidhean a chaidh a thilleadh le [[Special:Contributions/$2|$2]] ([[User talk:$2|deasbaireachd]]) dhan mhùthadh mu dheireadh le [[User:$1|$1]]",
+ "revertpage": "Deasachaidhean a chaidh a thilleadh leis [[Special:Contributions/$2|$2]] ([[User talk:$2|an deasbaireachd]]) dhan mhùthadh mu dheireadh le [[User:$1|$1]]",
+ "revertpage-nouser": "Deasachaidhean a chaidh a thilleadh le cleachdaiche falaichte dhan mhùthadh mu dheireadh le [[User:$1|$1]]",
+ "rollback-success": "Na deasachaidhean a chaidh a thilleadh le $1;\nchaidh an tilleadh gun mhùthadh mu dheireadh le $2.",
"protectlogpage": "Loga an dìon",
"protectlogtext": "Tha liosta na chaidh a dhìon gu h-ìosal.\nCuir sùil air [[Special:ProtectedPages|liosta nan duilleagan fo dhìon]] airson liosta na fheadhainn a tha fo dhìon an-dràsta fhèin.",
"protectedarticle": "\"[[$1]]\" air a dhìon",
"unprotectedarticle": "a neo-dhìon \"[[$1]]\"",
"protect-title": "A' dìonadh \"$1\"",
"prot_1movedto2": "[[$1]] gluaiste ri [[$2]]",
+ "protect-badnamespace-title": "Cha ghabh an t-ainm-spàs seo a dhìon",
+ "protect-badnamespace-text": "Cha ghabh duilleagan san ainm-spàs seo a dhìon.",
"protect-norestrictiontypes-title": "Cha ghabh an duilleag seo a dhìon",
"protect-legend": "Daingnich dìonadh",
"protectcomment": "Adhbhar:",
"protectexpiry": "Falbhaidh an ùine air:",
"protect_expiry_invalid": "Tha an t-àm-crìochnachaidh mì-dhligheach.",
"protect_expiry_old": "Tha an t-àm crìochnachaidh seachad mu thràth.",
- "protect-text": "Chì thu an ìre dìon dhen duilleag '''$1''' an-seo agus is urrainn dhut atharrachadh an-seo.",
- "protect-locked-access": "Chan eil cead aig a' chunntas agad an ìre dìon de dhuilleag atharrachadh.\nSeo roghainnean làithreach na duilleige '''$1''':",
- "protect-cascadeon": "Tha an duilleag seo fo dhìon an-dràsta a chionn 's gu bheil e air a ghabhail a-steach {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} a leanas aig a bheil dìon easach air.\n'S urrainn dhut ìre dìon na duilleige seo atharrachadh ach cha bhi buaidh air an dìon easach.",
+ "protect-text": "Chì thu an ìre dìon dhen duilleag <strong>$1</strong> an-seo agus is urrainn dhut atharrachadh an-seo.",
+ "protect-locked-access": "Chan eil cead aig a' chunntas agad an ìre dìon de dhuilleag atharrachadh.\nSeo roghainnean làithreach na duilleige <strong>$1</strong>:",
+ "protect-cascadeon": "Tha an duilleag seo fo dhìon an-dràsta a chionn 's gu bheil e air a ghabhail a-steach {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} a leanas aig a bheil dìon o bhith mar eas air.\n'S urrainn dhut ìre dìon na duilleige seo atharrachadh ach cha bhi buaidh air an dìon o bhith mar eas.",
"protect-default": "Ceadaich a h-uile cleachdaiche",
"protect-fallback": "Na ceadaich ach do chleachdaichean aig a bheil cead \"$1\"",
"protect-level-autoconfirmed": "Na ceadaich ach cleachdaichean a chaidh an dearbhadh gu fèin-obrachail",
"protect-level-sysop": "Na ceadaich ach rianadairean",
+ "protect-summary-desc": "[$1=$2] ($3)",
"protect-summary-cascade": "mar eas",
"protect-expiring": "falbhaidh an ùine air $1 (UTC)",
"protect-expiring-local": "falbhaidh an ùine air $1",
"protect-expiry-indefinite": "buan",
- "protect-cascade": "Dìon duilleagan a tha 'gan gabhail a-steach san duilleag seo (dìon mar eas)",
+ "protect-cascade": "Dìon duilleagan a tha 'gan gabhail a-steach san duilleag seo (dìon o bhith mar eas)",
"protect-cantedit": "Chan urrainn dhut ìre dìon na duilleige seo atharrachadh a chionn 's nach eil cead deasachaidh agad air.",
"protect-othertime": "Àm eile:",
"protect-othertime-op": "àm eile",
+ "protect-existing-expiry": "Falbhaidh an ùine air mar-thà: $2 $3",
+ "protect-otherreason": "Adhbhar eile/a bharrachd:",
+ "protect-otherreason-op": "Adhbhar eile",
+ "protect-dropdown": "*Na h-adhbharan dìona as cumanta\n** Cus bhandalachd\n** Cus spama\n** Còmhstrithean deasachaidh nach eil torrach\n** Duilleag air a bheil trafaig mhòr",
+ "protect-edit-reasonlist": "Deasaich adhbharan dìona o dheasachadh",
+ "protect-expiry-options": "1 uair a thìde:1 hour, 1 latha:1 day, 1 seachdain:1 week, 2 sheachdain:2 weeks, 1 mhìos:1 month, 3 mìosan:3 months, 6 mìosan:6 months, 1 bhliadhna:1 year,buan:infinite",
"restriction-type": "Cead:",
"restriction-level": "Ìre bacaidh:",
- "undeleterevisions": "Chaidh {{PLURAL:$1|$1 leth-bhreac|$1 leth-bhreac|$1 leth-bhreacan|$1 leth-bhreac}} a chur san tasg-lann",
+ "minimum-size": "Meud as lugha",
+ "maximum-size": "Meud as motha:",
+ "pagesize": "(baidhtichean)",
+ "restriction-edit": "Deasaich",
+ "restriction-move": "Gluais",
+ "restriction-create": "Cruthaich",
+ "restriction-upload": "Luchdaich suas",
+ "restriction-level-sysop": "le dìon slàn air",
+ "restriction-level-autoconfirmed": "le leth-dhìon air",
+ "restriction-level-all": "ìre sam bith",
+ "undelete": "Seal na duilleagan air an sguabadh às",
+ "undeletepage": "Seall 's aisig duilleagan air an sguabadh às",
+ "undeletepagetitle": "<strong>Chan e ach mùthaidhean de [[:$1|$1]] a chaidh a sguabadh às a tha sna leanas</strong>.",
+ "undelete-fieldset-title": "Aisig mùthaidhean",
+ "undeleterevisions": "Chaidh {{PLURAL:$1|$1 mhùthadh|$1 mhùthadh|$1 mùthaidhean|$1 mùthadh}} a chur san tasg-lann",
+ "undeletehistorynoadmin": "Chaidh an duilleag seo a sguabadh às.\nChì thu adhbhar an sguabaidh às sa ghearr-chunntas gu h-ìosal cho math ri fiosrachadh mu na chleachdaichean a dheasaich an duilleag seo mus deach a sguabadh às.\nChan fhaic ach rianairean an teacsa fhèin aig na mùthaidhean air an sguabadh às.",
"undeletelink": "seall/aisig",
"undeleteviewlink": "seall",
- "namespace": "Namespace:",
+ "namespace": "Ainm-spàs:",
"invert": "Cuir na thagh mi bun os cionn",
- "namespace_association": "Namespace co-cheangailte ris",
+ "tooltip-invert": "Cuir cromag sa bhogsa seo gus atharraichean air an duilleag seo fhalach am broinn an ainm-spàs a thagh thu ('s an ainm-spàs co-cheangailte riutha ma tha cromag ris)",
+ "namespace_association": "An t-ainm-spàs co-cheangailte ris",
+ "tooltip-namespace_association": "Cuir cromag sa bhogsa ach an dèid ainm-spàs na deasbaireachd no nan cuspairean a tha ceangailte ris an ainm-spàs a thagh thu a ghabhail a-steach",
"blanknamespace": "(Prìomh)",
- "contributions": "Mùthaidhean a' {{GENDER:$1|chleachdaiche}}",
- "contributions-title": "Mùthaidhean a rinn $1",
- "mycontris": "Mùthaidhean",
- "contribsub2": "Airson {{GENDER:$3|$1}} ($2)",
+ "contributions": "Obair a' chleachdaiche",
+ "contributions-title": "Obair a rinn $1",
+ "mycontris": "M' obair",
+ "contribsub2": "Airson $1 ($2)",
"uctop": "(làithreach)",
"month": "On mhìos (agus na bu tràithe):",
"year": "On bhliadhna (agus na bu tràithe):",
- "sp-contributions-newbies": "Seall mùthaidhean le cunntasan ùra a-mhàin",
+ "sp-contributions-newbies": "Seall obair le cunntasan ùra a-mhàin",
+ "sp-contributions-newbies-title": "Obair le cunntasan ùra",
"sp-contributions-blocklog": "an loga bacaidh",
+ "sp-contributions-suppresslog": "obair a chaidh a mhùchadh",
+ "sp-contributions-deleted": "obair air a sguabadh às",
"sp-contributions-uploads": "a' luchdadh suas",
"sp-contributions-logs": "logaichean",
"sp-contributions-talk": "deasbaireachd",
- "sp-contributions-search": "Lorg mùthaidhean leis",
+ "sp-contributions-userrights": "stiùireadh ceadan a' chleachdaiche",
+ "sp-contributions-search": "Lorg airson obair a rinneadh",
"sp-contributions-username": "Seòladh IP no ainm-cleachdaiche:",
- "sp-contributions-toponly": "Na seall deasachaidhean ach na lèirmheasan as ùire",
+ "sp-contributions-toponly": "Na seall deasachaidhean ach na mùthaidhean as ùire",
"sp-contributions-submit": "Lorg",
"whatlinkshere": "Na tha a' ceangal a-nall an-seo",
"whatlinkshere-title": "Duilleagan a tha a' ceangal ri \"$1\"",
"whatlinkshere-page": "Duilleag:",
- "linkshere": "Tha na duilleagan a leanas a' ceangal ri '''[[:$1]]''':",
- "nolinkshere": "Chan eil ceangal air duilleag sam bith a tha a' dol gu '''[[:$1]]'''.",
+ "linkshere": "Tha na duilleagan a leanas a' ceangal ri <strong>[[:$1]]</strong>:",
+ "nolinkshere": "Chan eil ceangal air duilleag sam bith a tha a' dol gu <strong>[[:$1]]</strong>.",
+ "nolinkshere-ns": "Chan eil ceangal gu <strong>[[:$1]]</strong> ann an duilleag sam bith san ainm-spàs a thagh thu.",
"isredirect": "duilleag ath-sheòlaidh",
"istemplate": "transclusion",
"isimage": "ceangal faidhle",
- "whatlinkshere-prev": "{{PLURAL:$1|roimhe|$1 roimhe}}",
- "whatlinkshere-next": "{{PLURAL:$1|an ath|an ath $1|na ath $1|an ath $1}}",
+ "whatlinkshere-prev": "{{PLURAL:$1|an $1 roimhe|an $1 roimhe|na $1 roimhe|am $1 roimhe}}",
+ "whatlinkshere-next": "{{PLURAL:$1|an ath $1|an ath $1|na ath $1|an ath $1}}",
"whatlinkshere-links": "← ceanglaichean",
"whatlinkshere-hideredirs": "$1 ath-sheòlaidhean",
"whatlinkshere-hidetrans": "$1 transclusions",
"whatlinkshere-hidelinks": "$1 ceanglaichean",
"whatlinkshere-hideimages": "$1 ceanglaichean nam faidhlichean",
"whatlinkshere-filters": "Criathairean",
- "blockip": "Bac cleachdaiche",
+ "block": "Bac an cleachdaiche",
+ "unblock": "Neo-bhac an cleachdaiche",
+ "blockip": "Bac an cleachdaiche",
"ipbreason": "Adhbhar:",
"ipbsubmit": "Bac an cleachdaiche seo",
- "ipboptions": "2 uair a thìde:2 hours, 1 latha:1 day, 3 làithean:3 days, 1 seachdain:1 week, 2 sheachdain:2 weeks, 1 mhìos:1 month, 3 mìosan:3 months, 6 mìosan:6 months, 1 bhliadhna:1 year,neo-chrìochnach:infinite",
+ "ipboptions": "2 uair a thìde:2 hours, 1 latha:1 day, 3 làithean:3 days, 1 seachdain:1 week, 2 sheachdain:2 weeks, 1 mhìos:1 month, 3 mìosan:3 months, 6 mìosan:6 months, 1 bhliadhna:1 year,buan:infinite",
+ "ipbwatchuser": "Cum sùil air duilleagan a' chleachdaiche 's deasbaireachd aig a' chleachdaiche seo",
+ "ipb-disableusertalk": "Chan fhaod an cleachdaiche seo an duilleag deasbaireachd aige fhèin a dheasachadh fhad 's a bhios e bacte",
"badipaddress": "Chan eil an seòladh IP aig a' cleachdair seo iomchaidh",
"blockipsuccesssub": "Shoirbhich leat leis a' bhacadh",
"blockipsuccesstext": "Chaidh [[Special:Contributions/$1|$1]] a bhacadh.\n<br />Faic [[Special:BlockList|liosta nan IP bacte]] gus sùile a thoirt air na bacaidhean.",
+ "ipb-confirmhideuser": "Cha thu an impis cleachdaiche a bhacadh le \"falaich cleachdaiche\" an comas. Mùchaidh seo ainm a' chleachdaiche anns gach uile liosta 's nì loga. A bheil thu cinnteach gu bheil thu airson seo a dhèanamh?",
+ "ipb-blocklist-contribs": "Obair a rinn $1",
"unblockip": "Neo-bhac an cleachdaiche",
"ipusubmit": "Thoir air falbh am bacadh seo",
"ipblocklist": "Cleachdaichean a chaidh a bhacadh",
+ "blocklist-nousertalk": "chan fhaod e an duilleag deasbaireachd aige fhèin a dheasachadh",
"blocklink": "bac",
"unblocklink": "neo-bhac",
"change-blocklink": "mùth bacadh",
"contribslink": "mùthaidhean",
"blocklogpage": "Loga nam bacadh",
+ "blocklog-showsuppresslog": "Chaidh an cleachdaiche seo a bhacadh 's a mhùchadh roimhe.\nSeo dhut loga a' mhùchaidh:",
"blocklogentry": "Chaidh bacadh a chrìochnaicheas ann an $2 a chur air [[$1]] $3",
"unblocklogentry": "\"$1\" air a neo-bhacadh",
"block-log-flags-nocreate": "cruthachadh de chunntasan ùra à comas",
+ "block-log-flags-nousertalk": "chan fhaod e an duilleag deasbaireachd aige fhèin a dheasachadh",
"ipb_expiry_invalid": "Tha an t-àm-crìochnachaidh mì-dhligheach.",
+ "ipb_hide_invalid": "Cha ghabh an cunntas seo a mhùchadh on a tha barrachd air $1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}} aige.",
"ip_range_invalid": "Raon IP neo-iomchaidh.",
"lockdb": "Glais an stòr-dàta",
"lockconfirm": "Seadh, is ann a tha mi ag iarraidh an stòr-dàta a ghlasadh.",
"lockbtn": "Glais an stòr-dàta",
"lockdbsuccesssub": "Shoirbhich leat le glasadh an stòir-dhàta",
+ "lockedbyandtime": "(le $1 $2 $3)",
"move-page-legend": "Gluais duilleag",
- "movepagetext": "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.\nBidh an seann tiotal 'na ath-sheòladh dhan tiotal ùr an uairsin.\n'S urrainn dhut ath-sheòladh sam bith a tha a' dol dhan tiotal tùsail ùrachadh leis fhèin.\nMura dèan thu sin, dèan cinnteach gun cuir thu sùil air eagal 's gum bi [[Special:DoubleRedirects|ath-sheòlaidhean dùbailte]] no [[Special:BrokenRedirects|briste]] ann.\n'S ann ort-sa a tha an t-uallach airson dèanamh cinntach gu bheil na ceanglaichean a' dol dha na h-àitichean ceart.\n\nThoir an aire '''nach dèid''' an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.\n'S ciall dha seo gun urrainn dhut ainm duilleige a thilleadh dhan ainm a bha air roimhe ma rinn thu mearachd agus nach urrainn dhut sgrìobhadh thairis air duilleag a tha ann.\n\n'''Rabhadh!'''\nFaodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;\ndèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
- "movepagetalktext": "Thèid an duilleag deasbaireachd a tha co-cheangailte ris a ghluasad 'na cois '''ach:'''\n*Ma tha duilleag deasbaireachd nach eil falamh aig an ainm ùr mu thràth, no\n*Ma bheir thu air falbh a' chromag on bhogsa gu h-ìosal\n\nMa thachras seo, feumaidh to an duilleag a ghluasad no cho-aontachadh a làimh, ma tha sin fa-near dhut.",
+ "movepagetext": "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.\nBidh an seann tiotal 'na ath-sheòladh dhan tiotal ùr an uairsin.\n'S urrainn dhut ath-sheòladh sam bith a tha a' dol dhan tiotal tùsail ùrachadh leis fhèin.\nMura dèan thu sin, dèan cinnteach gun cuir thu sùil air eagal 's gum bi [[Special:DoubleRedirects|ath-sheòlaidhean dùbailte]] no [[Special:BrokenRedirects|briste]] ann.\n'S ann ort-sa a tha an t-uallach airson dèanamh cinntach gu bheil na ceanglaichean a' dol dha na h-àitichean ceart.\n\nThoir an aire <strong>nach dèid</strong> an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.\n'S ciall dha seo gun urrainn dhut ainm duilleige a thilleadh dhan ainm a bha air roimhe ma rinn thu mearachd agus nach urrainn dhut sgrìobhadh thairis air duilleag a tha ann.\n\n<strong>Rabhadh!</strong>\nFaodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;\ndèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
+ "movepagetalktext": "Thèid an duilleag deasbaireachd a tha co-cheangailte ris a ghluasad 'na cois <strong>ach:</strong>\n*Ma tha duilleag deasbaireachd nach eil falamh aig an ainm ùr mu thràth, no\n*Ma bheir thu air falbh a' chromag on bhogsa gu h-ìosal\n\nMa thachras seo, feumaidh to an duilleag a ghluasad no cho-aonachadh a làimh, ma tha sin fa-near dhut.",
"movearticle": "Gluais duilleag:",
+ "movecategorypage-warning": "<strong>Rachadh:</strong> Tha thu airson duilleag roinn-seòrsa a ghluasad. Thoir an aire nach dèid ach an duilleag a ghluasad 's <em>gur ann nach dèid</em> gach duilleag a tha san t-seann roinn-seòrsa a chur ris an roinn-seòrsa ùr.",
+ "cant-move-category-page": "Chan eil cead agad duilleagan roinn-seòrsa a ghluasad.",
+ "cant-move-to-category-page": "Chan eil cead agad duilleag a ghluasad gu duilleag roinn-seòrsa.",
"newtitle": "Dhan tiotal ùr:",
"move-watch": "Cum sùil air an duilleag thùsail agus an duilleag thairgaideach",
"movepagebtn": "Gluais duilleag",
"pagemovedsub": "Shoirbhich leat leis a' ghluasad",
- "movepage-moved": "'''Chaidh \"$1\" a ghluasad a \"$2\"'''",
+ "movepage-moved": "<strong>Chaidh \"$1\" a ghluasad a \"$2\"</strong>",
+ "movepage-moved-noredirect": "Chaidh cruthachadh an ath-stiùiridh seo a mhùchadh.",
"articleexists": "Tha duilleag ann mu thràth air a bheil an t-ainm seo no chan eil an t-ainm a thagh thu dligheachd.\nNach tagh thu ainm eile?",
"movetalk": "Gluais an duilleag deasbaireachd a tha co-cheangailte ris",
+ "move-talk-subpages": "Gluais na fo-dhuilleagan aig duilleag deasbaireachd (suas ri $1)",
"movelogpage": "Loga nan gluasadan",
+ "movesubpage": "{{PLURAL:$1|Fo-dhuilleag|Fo-dhuilleagan}}",
"movereason": "Adhbhar:",
"revertmove": "till",
"delete_and_move": "Sguab às agus gluais",
"delete_and_move_confirm": "Siuthad, sguab às an duilleag",
+ "immobile-source-namespace": "Cha ghabh duilleagan a ghluasad san ainm-spàs \"$1\"",
+ "immobile-target-namespace": "Cha ghabh duilleagan a ghluasad dhan ainm-spàs \"$1\"",
+ "imagenocrossnamespace": "Cha ghabh faidhle a ghluasad gu ainm-spàs nach eil 'na fhaidhle",
+ "nonfile-cannot-move-to-file": "Cha ghabh rud nach eil 'na fhaidhle a ghluasad gu ainm-spàs a bheil 'na fhaidhle",
+ "move-over-sharedrepo": "== Tha am faidhle ann ==\nTha [[:$1]] ann an ionad-tasgaidh co-roinnte. Thèid tar-àithneadh air an fhaidhle cho-roinnte ma ghluaiseas tu faidhle gun tiotal seo.",
+ "file-exists-sharedrepo": "Tha ainm an fhaidhle a thagh thu 'ga chleachdadh ann an ionad-tasgaidh co-roinnte mar-thà.\nFeuch an tagh thu ainm eile.",
"export": "Às-phortaich duilleagan",
+ "exportlistauthors": "Cuir liosta shlàn dhe na deasaichean ris gach duilleag",
+ "export-addcattext": "Cuir duilleagan ris o roinn-seòrsa:",
+ "export-addnstext": "A h-uile duilleag on ainm-spàs:",
"allmessages": "Teachdaireachdan an t-siostaim",
"allmessagesname": "Ainm",
"allmessagesdefault": "Teacsa bunaiteach na teachdaireachd",
- "allmessagestext": "Seo liosta de theachdaireachdan an t-siostaim a tha ri làimh ann an namespace MediaWiki.\nTadhail air [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Ionadaileadh MediaWiki] is [//translatewiki.net translatewiki.net] ma tha thu airson pàirt a ghabhail ann an ionadaileadh MediaWiki.",
+ "allmessagestext": "Seo liosta de theachdaireachdan an t-siostaim a tha ri làimh ann an ainm-spàs MediaWiki.\nTadhail air [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Ionadaileadh MediaWiki] is [//translatewiki.net translatewiki.net] ma tha thu airson pàirt a ghabhail ann an ionadaileadh MediaWiki.",
"thumbnail-more": "Meudaich",
"filemissing": "Faidhle a dhìth",
- "thumbnail_error": "Mearachd le cruthachadh na h-ìomhaigheige: $1",
+ "thumbnail_error": "Mearachd le cruthachadh na dealbhaige: $1",
+ "thumbnail-temp-create": "Cha deach leinn faidhle sealach na dealbhaige a chruthachadh",
+ "thumbnail-dest-create": "Cha deach leinn an dealbhag a shàbhaladh gun cheann-uidhe",
+ "thumbnail_invalid_params": "Paramadairean na dealbhaige mì-dhligheach",
+ "thumbnail_image-failure-limit": "Chaidh feuchainn cus tursan ($1 no a bharrachd) o chionn goirid gus an dealbhag seo a reandaradh. Feuch ris a-rithist uaireigin eile.",
+ "import-interwiki-namespace": "Ainm-spàs-uidhe:",
+ "import-revision-count": "$1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mhùthadh}}",
+ "import-error-special": "Cha deach an duilleag \"$1\" ion-phortadh on a bhuineas i ri ainm-spàs sònraichte nach ceadaich duilleagan.",
+ "import-rootpage-nosubpage": "Cha cheadaich an t-ainm-spàs \"$1\" aig an duilleag freumha fo-duilleagan.",
+ "import-logentry-upload-detail": "$1 {{PLURAL:$1|mhùthadh|mùthadh|mùthaidhean|mùthadh}}",
+ "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} o $2",
"tooltip-pt-userpage": "An duilleag phearsanta agad",
- "tooltip-pt-mytalk": "Duilleag do chonaltraidh",
+ "tooltip-pt-mytalk": "Duilleag do dheasbaireachd",
"tooltip-pt-preferences": "Do roghainnean",
"tooltip-pt-watchlist": "Seo liosta nan duilleagan a tha thu a' cumail sùil orra a thaobh mhùthaidhean a nithear orra",
- "tooltip-pt-mycontris": "Liosta do mhùthaidhean",
+ "tooltip-pt-mycontris": "Liosta na h-obrach a rinn thu",
"tooltip-pt-login": "Mholamaidh dhut logadh a-steach; ge-tà, cha leig thu leas seo a dhèanamh",
"tooltip-pt-logout": "Log a-mach",
"tooltip-ca-talk": "Deasbad mu dhuilleag na susbainte",
"tooltip-n-mainpage-description": "Tadhail air an duilleag mhòr",
"tooltip-n-portal": "Mun phròiseact, nas urrainn dhut dèanamh is far an lorg thu nithean",
"tooltip-n-currentevents": "Lorg fiosrachadh a bharrachd mu thachartasan an latha",
- "tooltip-n-recentchanges": "Liosta nam mùthaidhean ùra aig an uici.",
+ "tooltip-n-recentchanges": "Liosta nam mùthaidhean ùra aig an uicidh.",
"tooltip-n-randompage": "Luchdaich duilleag air thuaiream",
"tooltip-n-help": "Far am faigh thu fiosrachadh",
- "tooltip-t-whatlinkshere": "Liosta de gach duilleag uici a tha a' ceangal ris an duilleag seo",
+ "tooltip-t-whatlinkshere": "Liosta de gach duilleag uicidh a tha a' ceangal ris an duilleag seo",
"tooltip-t-recentchangeslinked": "Mùthaidhean a rinneadh o chionn ghoirid air duilleagan a tha ceangal ann thuca on duilleag seo",
"tooltip-feed-rss": "Inbhir RSS airson na duilleige seo",
"tooltip-feed-atom": "Inbhir Atom airson na duilleige seo",
- "tooltip-t-contributions": "Seall liosta nam mùthaidhean a rinn a' chleachdaiche seo",
+ "tooltip-t-contributions": "Seall liosta na h-obrach a rinn an cleachdaiche seo",
"tooltip-t-emailuser": "Cuir post-dealain dhan chleachdaiche seo",
"tooltip-t-upload": "Luchdaich suas faidhle",
"tooltip-t-specialpages": "Liosta de gach duilleag shònraichte",
"tooltip-ca-nstab-project": "Seall duilleag a' phròiseict",
"tooltip-ca-nstab-image": "Seall duilleag an fhaidhle",
"tooltip-ca-nstab-template": "Seall an teamplaid",
- "tooltip-ca-nstab-category": "Seall duilleag na roinne",
+ "tooltip-ca-nstab-category": "Seall duilleag na roinn-seòrsa",
"tooltip-minoredit": "Comharraich seo mar dheasachadh beag",
"tooltip-save": "Sàbhail na mùthaidhean agad",
"tooltip-preview": "Ro-sheall na mùthaidhean agad; saoil an cleachd thu seo mus sàbhail thu iad?",
"tooltip-diff": "Seall na mùthaidhean a chuir mi air an teacs",
"tooltip-compareselectedversions": "Seall an diofar eadar an dà mhùthadh dhen duilleag seo a thagh thu",
"tooltip-watch": "Cuir an duilleag seo air do chlàr-faire",
+ "tooltip-watchlistedit-raw-submit": "Ùraich an clàr-faire",
"tooltip-rollback": "Ma chleachdas tu \"Roilig air ais\", tillidh thu gach mùthadh a rinn deasaiche àraid le aon bhriogadh",
"tooltip-undo": "Tillidh \"Neo-dhèan\" am mùthadh seo 's fosglaidh e am foirm mùthaidh ann am modh an ro-sheallaidh. 'S urrainn dhut adhbhar a chur an cèill sa ghearr-chunntas air an dòigh seo.",
"tooltip-summary": "Cuir a-steach gearr-chunntas",
- "anonymous": "{{PLURAL:$1|cleachdaiche|cleachdaichean}} gun ainm o {{SITENAME}}",
+ "anonymous": "{{PLURAL:$1|Cleachdaiche|Cleachdaichean}} gun ainm o {{SITENAME}}",
"siteuser": "cleachdaiche {{SITENAME}} $1",
"othercontribs": "Stèidhichte air obair le $1.",
"others": "eile",
- "siteusers": "{{PLURAL:$2|cleachdaiche|cleachdaichean}} {{SITENAME}} $1",
+ "siteusers": "{{PLURAL:$2|Cleachdaiche|Cleachdaichean}} {{SITENAME}} $1",
+ "pageinfo-hidden-categories": "{{PLURAL:$1|Roinn-seòrsa fhalaichte|Roinnean-seòrsa falaichte}} ($1)",
"pageinfo-toolboxlink": "Fiosrachadh mun duilleag",
+ "pageinfo-protect-cascading": "'Ga dhìon o bhith mar eas on a sheo",
+ "pageinfo-protect-cascading-from": "'Ga dhìon o bhith mar eas uaithe",
+ "pageinfo-category-info": "Fiosrachadh mun roinn-seòrsa",
+ "pageinfo-category-subcats": "Àireamh de fho-roinnean-seòrsa",
+ "markaspatrolleddiff": "Cuir comharra freiceadain ris",
+ "markaspatrolledtext": "Cuir comharra freiceadain ris an duilleag seo",
+ "markedaspatrolled": "Comharra freiceadain ris",
+ "markedaspatrolledtext": "Chaidh comharra freiceadain a chur ris a' mhùthadh de [[:$1]] a thagh thu.",
+ "rcpatroldisabled": "Chaidh feart nam freiceadan airson atharraichean o chionn goirid a chur à comas",
+ "rcpatroldisabledtext": "Tha feart nam freiceadan airson atharraichean o chionn goirid à comas an-dràsta.",
+ "markedaspatrollederror": "Cha ghabh comharra freiceadain a chur ris",
+ "markedaspatrollederrortext": "Feumaidh tu mùthadh a shònrachadh gus comharra freiceadain a chur ris.",
+ "markedaspatrollederror-noautopatrol": "Chan fhaod thu comharra freiceadain a chur ris na h-atharraichean agad fhèin.",
+ "markedaspatrollednotify": "Chaidh comharra freiceadain a cur ris an atharrachadh seo air $1.",
+ "markedaspatrollederrornotify": "Cha b' urrainn dhuinn comharra freiceadain a chur ris.",
+ "patrol-log-page": "Loga nam freiceadan",
+ "patrol-log-header": "Seo loga nam mùthaidhean le comharra freiceadain riutha.",
+ "log-show-hide-patrol": "$1 loga nam freiceadan",
"previousdiff": "← Mùthadh nas sine",
"nextdiff": "Deasachadh nas ùire →",
+ "imagemaxsize": "Crìochan air meud an deilbh:<br /><em>(airson duilleagan tuairisgeul an fhaidhle)</em>",
+ "thumbsize": "Meud na dealbhaige:",
"file-info-size": "$1 × $2 pixel, meud an fhaidhle: $3, seòrsa MIME: $4",
"file-nohires": "Chan eil dùmhlachd-bhreacaidh nas fhearr ri fhaighinn.",
"svg-long-desc": "Faidhle SVG, a-rèir ainm $1 × $2 pixel, meud faidhle: $3",
"show-big-image": "Am faidhle tùsail",
+ "file-no-thumb-animation": "<strong>An aire: Cha bhi beòthachadh air dealbhagan an fhaidhle seo ri linn cuingeachaidhean teicnigeach.</strong>",
+ "file-no-thumb-animation-gif": "<strong>An aire: Cha bhi beòthachadh air dealbhagan airson dealbhan GIF le dùmhlachd-bhreacaidh àrd mar an tè seo ri linn cuingeachaidhean teicnigeach.</strong>",
"ilsubmit": "Rannsaich",
"bydate": "air ceann-latha",
"bad_image_list": "Seo mar a tha am fòrmat:\n\nCha bheachdaichear ach air buill liosta (loidhniche a tha * air am beulaibh).\nFeumaidh a' chiad cheangal air loidhne a bhith 'na cheangal ri droch fhaidhle.\nThathar a' coimhead air ceangal sam bith eile san loidhne sin mar eisgeachdan, 's e sin duilleagan far am faod am faidhle a bhith sa loidhne.",
"metadata-expand": "Seall am fiosrachadh a bharrachd",
"metadata-collapse": "Cuir am fiosrachadh a bharrachd am falach",
"metadata-fields": "Thèid raointean meata-dhàta nan dealbhan a tha ainmichte san teachdaireachd seo a ghabhail a-steach air duilleag an deilbh nuair a bhios clàr a' mheata-dàta air a dhùmhlachadh.\nBidh an fheadhainn eile falaichte a ghnàth.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+ "exif-copyright": "Seilbheadair na còrach-lethbhreac",
+ "exif-devicesettingdescription": "Tuairisgeul aig roghainnean an uidheim",
+ "exif-iimcategory": "Roinn-seòrsa",
+ "exif-iimsupplementalcategory": "Roinnean-seòrsa foirlionach",
+ "exif-copyrighted": "Staid na còrach-lethbhreac",
+ "exif-copyrightowner": "Seilbheadair na còrach-lethbhreac",
+ "exif-webstatement": "Aithris na còrach-lethbhreac air loidhne",
+ "exif-licenseurl": "URL airson ceadachas na còrach-lethbhreac",
+ "exif-contact-value": "$1\n\n$2\n<div class=\"adr\">\n$3\n\n$4, $5, $6 $7\n</div>\n$8",
+ "exif-subjectnewscode-value": "$2 ($1)",
+ "exif-compression-1": "Gun dùmhlachadh",
+ "exif-compression-5": "LZW",
+ "exif-compression-6": "JPEG (sean)",
+ "exif-compression-7": "JPEG",
+ "exif-compression-8": "Deflate (Adobe)",
+ "exif-compression-32773": "PackBits (Macintosh RLE)",
+ "exif-compression-32946": "Deflate (PKZIP)",
+ "exif-compression-34712": "JPEG2000",
+ "exif-copyrighted-true": "Fo chòir-lethbhreac",
+ "exif-copyrighted-false": "Cha deach staid na còrach-lethbhreac a shuidheachadh",
+ "exif-photometricinterpretation-2": "RGB",
+ "exif-photometricinterpretation-6": "YCbCr",
+ "exif-unknowndate": "Gun fhios air a' cheann-là",
+ "exif-orientation-1": "Àbhaisteach",
+ "exif-orientation-2": "Air a fhlipeadh air a' chòmhnard",
+ "exif-orientation-3": "Cuairtichte le 180°",
+ "exif-orientation-4": "Air a fhlipeadh gu h-inghearach",
+ "exif-orientation-5": "Cuairtichte le 90° gu tuathail 's air a fhlipeadh gu h-inghearach",
+ "exif-orientation-6": "Cuairtichte le 90° gu tuathail",
+ "exif-orientation-7": "Cuairtichte le 90° gu deiseil 's air a fhlipeadh gu h-inghearach",
+ "exif-orientation-8": "Cuairtichte le 90° gu deiseil",
+ "exif-xyresolution-i": "$1 dpi",
+ "exif-xyresolution-c": "$1 dpc",
+ "exif-colorspace-1": "sRGB",
+ "exif-colorspace-65535": "Gun chailbhreachadh",
+ "exif-componentsconfiguration-0": "chan eil e ann",
+ "exif-componentsconfiguration-1": "Y",
+ "exif-componentsconfiguration-2": "Cb",
+ "exif-componentsconfiguration-3": "Cr",
+ "exif-componentsconfiguration-4": "R",
+ "exif-componentsconfiguration-5": "G",
+ "exif-componentsconfiguration-6": "B",
+ "exif-exposureprogram-0": "Gun mhìneachadh",
+ "exif-exposureprogram-1": "A làimh",
+ "exif-exposureprogram-2": "Prògram àbhaisteach",
+ "exif-subjectdistance-value": "$1 {{PLURAL:$1|mheatair|mheatair|meatairean|meatair}}",
+ "exif-meteringmode-0": "Chan eil fhios",
+ "exif-meteringmode-1": "Cuibheasach",
+ "exif-meteringmode-255": "Eile",
+ "exif-lightsource-0": "Chan eil fhios",
+ "exif-lightsource-20": "D55",
+ "exif-lightsource-21": "D65",
+ "exif-lightsource-22": "D75",
+ "exif-lightsource-23": "D50",
+ "exif-flash-mode-2": "bacadh riatanach air an t-solas-boillsgidh",
+ "exif-flash-mode-3": "modh fèin-obrachail",
+ "exif-focalplaneresolutionunit-2": "òirleach",
+ "exif-sensingmethod-1": "Gun mhìneachadh",
+ "exif-gaincontrol-0": "Chan eil gin",
+ "exif-gpsspeed-k": "Cilemeatair san uair",
+ "exif-gpsspeed-m": "Mìle gach uair",
+ "exif-gpsspeed-n": "Mìle-mara san uair",
+ "exif-gpsdestdistance-k": "Cilemeatair",
+ "exif-gpsdestdistance-m": "Mìle",
+ "exif-gpsdestdistance-n": "Mìle-mara",
+ "exif-dc-contributor": "Deasaichean",
+ "exif-dc-date": "Ceann-là",
+ "exif-dc-publisher": "Foillsichear",
+ "exif-dc-relation": "Meadhanan co-cheangailte",
+ "exif-dc-rights": "Còirichean",
+ "exif-dc-source": "Meadhan tùsail",
+ "exif-dc-type": "Seòrsa a' mheadhain",
+ "exif-rating-rejected": "Air a dhiùltadh",
+ "exif-isospeedratings-overflow": "Nas motha na 65535",
+ "exif-maxaperturevalue-value": "$1 APEX (f/$2)",
"watchlistall2": "a h-uile",
"namespacesall": "uile",
"monthsall": "uile",
+ "confirmrecreate": "Sguab [[User:$1|$1]] ([[User talk:$1|an deasbaireachd]]) an duilleag seo às às dèidh do thòiseachadh air an deasachadh air an adhbhar seo:\n: <em>$2</em>\nDearbhaich gu bheil thu airson an duilleag seo ath-chruthachadh dha-rìribh.",
+ "confirmrecreate-noreason": "Sguab [[User:$1|$1]] ([[User talk:$1|an deasbaireachd]]) an duilleag seo às às dèidh do thòiseachadh air an deasachadh.\nDearbhaich gu bheil thu airson an duilleag seo ath-chruthachadh dha-rìribh.",
+ "confirm-watch-top": "A bheil thu airson an duilleag seo a chur ris a' chlàr-fhaire agad?",
+ "confirm-unwatch-top": "A bheil thu airson an duilleag seo a thoirt air falbh on chlàr-fhaire agad?",
"watchlistedit-normal-title": "Deasaich an clàr-faire",
+ "watchlistedit-normal-legend": "Thoir tiotalan air falbh on chlàr-fhaire",
+ "watchlistedit-normal-explain": "Chì thu na tiotalan a tha air a' chlàr-fhaire agad gu h-ìosal.\nGus tiotal a thoirt air falbh, cuir cromag sa bhogsa ri thaobh 's briog air \"{{int:Watchlistedit-normal-submit}}\".\n'S urrainn dhut [[Special:EditWatchlist/raw|còd an liosta a dheasachadh]] cuideachd.",
+ "watchlistedit-normal-submit": "Thoir tiotalan air falbh",
+ "watchlistedit-normal-done": "Chaidh {{PLURAL:$1|$1 tiotal|$1 thiotal|$1 tiotalan|$1 tiotal}} a thoirt far a' chlàir-fhaire agad:",
+ "watchlistedit-raw-title": "Deasaich còd a' chlàir-fhaire",
+ "watchlistedit-raw-legend": "Deasaich còd a' chlàir-fhaire",
"watchlistedit-raw-submit": "Ùraich an clàr-faire",
"watchlisttools-view": "Seall na mùthaidhean iomchaidh",
"watchlisttools-edit": "Seall is deasaich mo chlàr-faire",
"watchlisttools-raw": "Deasaich còd a' chlàir-fhaire",
- "duplicate-defaultsort": "'''Rabhadh:''' Tha an iuchair seòrsachaidh bhunaiteach \"$2\" a' dol thairis air seann iuchair eile, \"$1\".",
+ "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|an deasbaireachd]])",
+ "duplicate-defaultsort": "<strong>Rabhadh:</strong> Tha an iuchair seòrsachaidh bhunaiteach \"$2\" a' dol thairis air seann iuchair eile, \"$1\".",
"version": "Tionndadh",
+ "version-ext-colheader-description": "Tuairisgeul",
+ "version-poweredby-credits": "Tha an uicidh seo 'ga toirt dhut le cumhachd <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, còir-lethbhreac © 2001-$1 $2.",
+ "version-credits-summary": "Bu toigh leinn urram a thoirt air na daoine a leanas air sgàth 's an cuid obrach airson [[Special:Version|MediaWiki]].",
"specialpages": "Duilleagan sònraichte",
+ "specialpages-note-top": "Treòir",
"external_image_whitelist": " #Fàg an loidhne seo dìreach mar a tha e<pre>\n#Cuir mìrean nan regular expressions (dìreach a' phàirt eadar //) gu hìosal\n#Thèid seisean URL a lorg dhaibh am measg nan dealbhan air an taobh a-muigh (hotlinks)\n#Chithear an fheadhainn a tha a' freagairt ri seise a shealltainn air neo chithear ceangal dhan dealbh a-mhàin\n#Chan eil ann an loidhnichean a tha a' tòiseachadh le # ach beachdan\n#Chan eil aire do litrichean mòra no beaga\n\n#Cuir gach mì regex os cionn na loidhne seo. Fàg an loidhne seo dìreach mar a tha e</pre>",
"tag-filter": "Criathrag [[Special:Tags|thagaichean]]:",
+ "tags-description-header": "Tuairisgeul slàn a' chèill",
+ "logentry-delete-delete": "Sguab $1 às duilleag $3",
+ "logentry-delete-restore": "Dh'aisig $1 duilleag $3",
+ "logentry-delete-event": "Dh'atharraich $1 an fhaicsinneachd aig $5 {{PLURAL:$5|tachartas|thachartas|tachartasan|tachartas}} an loga air $3: $4",
+ "logentry-delete-revision": "Dh'atharraich $1 an fhaicsinneachd aig $5 {{PLURAL:$5|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} air $3: $4",
+ "logentry-delete-event-legacy": "Dh'atharraich $1 an fhaicsinneachd aig tachartasan an loga air $3",
+ "logentry-delete-revision-legacy": "Dh'atharraich $1 an fhaicsinneachd aig mùthaidhean air $3",
+ "logentry-suppress-delete": "Mhùch $1 duilleag $3",
+ "logentry-suppress-event": "Dh'atharraich $1 an fhaicsinneachd aig $5 {{PLURAL:$5|tachartas|thachartas|tachartasan|tachartas}} an loga air $3 gu dìomhair: $4",
+ "logentry-suppress-revision": "Dh'atharraich $1 an fhaicsinneachd aig $5 {{PLURAL:$5|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} air $3 gu dìomhair: $4",
+ "logentry-suppress-event-legacy": "Dh'atharraich $1 an fhaicsinneachd aig tachartasan an loga air $3 gu dìomhair",
+ "logentry-suppress-revision-legacy": "Dh'atharraich $1 an fhaicsinneachd aig mùthaidhean air $3 gu dìomhair",
+ "revdelete-summary-hid": "chaidh gearr-chunntas an deasachaidh fhalach",
+ "revdelete-summary-unhid": "chaidh gearr-chunntas an deasachaidh a nochdadh",
+ "logentry-move-move": "Ghluais $1 duilleag $3 gu $4",
+ "logentry-move-move-noredirect": "Ghluais $1 duilleag $3 gu $4 's cha do {{GENDER:$2|dh'fhàg e|dh'fhàg i|dh'fhàgadh}} ath-stiùireadh ann",
+ "logentry-move-move_redir": "Ghluais $1 duilleag $3 gu $4 slighe ath-stiùiridh",
+ "logentry-move-move_redir-noredirect": "Ghluais $1 duilleag $3 gu $4 slighe ath-stiùiridh ach cha do {{GENDER:$2|dh'fhàg e|dh'fhàg i|dh'fhàgadh}} ath-stiùireadh ann",
+ "logentry-patrol-patrol": "Chuir $1 comharra freiceadain ris a' mhùthadh $4 aig an duilleag $3",
+ "logentry-patrol-patrol-auto": "Chuir $1 comharra freiceadain ris a' mhùthadh $4 aig an duilleag $3 gu fèin-obrachail",
+ "logentry-newusers-newusers": "Chaidh cunntas a' chleachdaiche $1 a chruthachadh",
+ "logentry-newusers-create": "Chaidh cunntas a' chleachdaiche $1 a chruthachadh",
+ "logentry-newusers-create2": "Chaidh cunntas a' chleachdaiche $3 a chruthachadh le $1",
+ "logentry-newusers-byemail": "Chaidh cunntas a' chleachdaiche $3 a chruthachadh le $1 's chaidh am facal-faire a chur air a' phost-d",
+ "logentry-newusers-autocreate": "Chaidh cunntas a' chleachdaiche $1 a chruthachadh gu fèin-obrachail",
+ "logentry-rights-rights": "Dh'atharraich $1 {{GENDER:$2|a bhallrachd|a ballrachd}} ann am buidheann airson $3 o $4 gu $5",
+ "logentry-rights-rights-legacy": "Dh'atharraich $1 {{GENDER:$2|a bhallrachd|a ballrachd}} ann am buidheann airson $3",
+ "logentry-rights-autopromote": "Chaidh $1 àrdachadh o $4 gu $5 gu fèin-obrachail",
"rightsnone": "(chan eil gin)",
- "searchsuggest-containing": "anns a bheil..."
+ "searchsuggest-containing": "anns a bheil...",
+ "api-error-fileexists-shared-forbidden": "Tha faidhle air a bheil \"$1\" san ionad-tasgaich cho-roinnte mar-thà 's cha ghabh sgrìobhadh thairis air.",
+ "api-error-stasherror": "Thachair mearachd le luchdadh suas an fhaidhle dhan tasgadan.",
+ "expand_templates_remove_nowiki": "Mùch tagaichean <nowiki> san toradh"
}
"qbmyoptions": "As miñas páxinas",
"faq": "Preguntas máis frecuentes",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Nova sección",
- "vector-action-delete": "Borrar",
- "vector-action-move": "Mover",
- "vector-action-protect": "Protexer",
- "vector-action-undelete": "Restaurar",
- "vector-action-unprotect": "Cambiar a protección",
- "vector-view-create": "Crear",
- "vector-view-edit": "Editar",
- "vector-view-history": "Ver o historial",
- "vector-view-view": "Ler",
- "vector-view-viewsource": "Ver o código fonte",
"actions": "Accións",
- "vector-more-actions": "Máis",
"namespaces": "Espazos de nomes",
"variants": "Variantes",
"navigation-heading": "Menú de navegación",
"difference-missing-revision": "Non se {{PLURAL:$2|atopou revisión ningunha|atoparon $2 revisións}} desta diferenza ($1).\n\nA miúdo, isto está provocado por seguir unha ligazón de diferenzas obsoleta cara a unha páxina que foi borrada.\nO [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistro de borrados] contén máis detalles.",
"searchresults": "Resultados da procura",
"searchresults-title": "Resultados da procura de \"$1\"",
- "toomanymatches": "Devolvéronse demasiadas coincidencias; inténteo cunha consulta diferente",
"titlematches": "O título da páxina coincide",
"textmatches": "O texto da páxina coincide",
"notextmatches": "Non se atopou o texto en ningunha páxina",
"tooltip-summary": "Escriba un breve resumo",
"interlanguage-link-title": "$1 – $2",
"common.css": "/** O CSS que se coloque aquí será aplicado a todas as aparencias */",
- "monobook.css": "/* O CSS que se coloque aquí afectará a quen use a aparencia Monobook */",
- "vector.css": "/* O CSS que se coloque aquí afectará a quen use a aparencia Vector */",
"print.css": "/* O CSS que se coloque aquí afectará ás impresións */",
"noscript.css": "/* O CSS que se coloque aquí afectará aos usuarios co JavaScript desactivado */",
"group-autoconfirmed.css": "/* O CSS que se coloque aquí afectará soamente aos usuarios autoconfirmados */",
"group-sysop.css": "/* O CSS que se coloque aquí afectará soamente aos administradores */",
"group-bureaucrat.css": "/* O CSS que se coloque aquí afectará soamente aos burócratas */",
"common.js": "/* Calquera JavaScript que haxa aquí será cargado para todos os usuarios en cada páxina que vexan. */",
- "monobook.js": "/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia MonoBook */",
- "vector.js": "/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Vector */",
"group-autoconfirmed.js": "/* Calquera JavaScript que haxa aquí será cargado soamente para os usuarios autoconfirmados */",
"group-bot.js": "/* Calquera JavaScript que haxa aquí será cargado soamente para os bots */",
"group-sysop.js": "/* Calquera JavaScript que haxa aquí será cargado soamente para os administradores */",
"pageinfo-category-pages": "Número de páxinas",
"pageinfo-category-subcats": "Número de subcategorías",
"pageinfo-category-files": "Número de ficheiros",
- "skinname-monobook": "MonoBook",
"markaspatrolleddiff": "Marcar como revisada",
"markaspatrolledtext": "Marcar esta páxina como revisada",
"markedaspatrolled": "Marcar como revisado",
"qbmyoptions": "Ystellige",
"faq": "Froge, wo vilmol gstellt wäre",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Abschnitt zuefiege",
- "vector-action-delete": "Lesche",
- "vector-action-move": "Verschiebe",
- "vector-action-protect": "Schitze",
- "vector-action-undelete": "Widerhärstelle",
- "vector-action-unprotect": "Syteschutz ändere",
- "vector-view-create": "Aalege",
- "vector-view-edit": "Bearbeite",
- "vector-view-history": "Versionsgschicht",
- "vector-view-view": "Läse",
- "vector-view-viewsource": "Quälltext aaluege",
"actions": "Aktione",
"namespaces": "Namensryym",
"variants": "Variante",
"difference-missing-revision": "{{PLURAL:$2|Ei Version|$2 Versione}} vui däre Unterschidsaazeig ($1) {{PLURAL:$2|isch|sin}} nit gfunde wore.\n\nDää Fähler chunnt normalerwyys dur e veraltete Link zue dr Versionsgschicht vun ere Syte, wu in dr Zwischezyt glescht woren isch.\nEinzelheite chasch im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lesch-Logbuech] bschaue.",
"searchresults": "Suech-Ergäbnis",
"searchresults-title": "Suechergebniss fir „$1“",
- "toomanymatches": "D Aazahl vu dr Suechergebniss isch z gross, bitte versuech e anderi Abfrog.",
"titlematches": "Iberyystimmige mit Sytentitel",
"textmatches": "Iberyystimmige mit Inhalte",
"notextmatches": "Kei Iberyystimmige mit Inhalte",
"qbmyoptions": "મારાં પાનાં",
"faq": "FAQ\nવારંવાર પુછાતા પ્રશ્નો",
"faqpage": "Project:વારંવાર પુછાતા પ્રશ્નો",
- "vector-action-addsection": "નવી ચર્ચા",
- "vector-action-delete": "રદ કરો",
- "vector-action-move": "ખસેડો",
- "vector-action-protect": "સુરક્ષિત કરો",
- "vector-action-undelete": "રદ કરેલું પાછું વાળો",
- "vector-action-unprotect": "સુરક્ષા બદલો",
- "vector-view-create": "બનાવો",
- "vector-view-edit": "ફેરફાર કરો",
- "vector-view-history": "ઇતિહાસ જુઓ",
- "vector-view-view": "વાંચો",
- "vector-view-viewsource": "સ્રોત જુઓ",
"actions": "ક્રિયાઓ",
"namespaces": "નામાવકાશો",
"variants": "ભિન્ન રૂપો",
"diff-multi-manyusers": "{{PLURAL:$2|એક સભ્યએ કરેલું|$2 સભ્યોએ કરેલા}} ({{PLURAL:$1|વચગાળાનું એક પુનરાવર્તન દર્શાવ્યં|વચગાળાનાં $1 પુનરાવર્તનો દર્શાવ્યાં}} નથી.)",
"searchresults": "પરિણામોમાં શોધો",
"searchresults-title": "પરિણામોમાં \"$1\" શોધો",
- "toomanymatches": "શોધમાં ઘણાં બધાં પરિણામો મળ્યાં, કૃપા કરી નવો શબ્દ મૂકી શોધો.",
"titlematches": "પાનાનું શીર્ષક મળતું આવે છે",
"textmatches": "પાનાના શબ્દો મળતાં આવે છે",
"notextmatches": "આ શબ્દ કોઈ પાનામાં મળ્યો નથી",
"Mnemonic kek",
"Urhixidur",
"Xiaomingyan",
- "아라"
+ "아라",
+ "Mywood"
]
},
"tog-underline": "鏈接加底線:",
"qbmyoptions": "𠊎嘅頁面",
"faq": "常見問題解答",
"faqpage": "Project:常見問題解答",
- "vector-action-addsection": "加入話題",
- "vector-action-delete": "刪除",
- "vector-action-move": "移動",
- "vector-action-protect": "保護",
- "vector-action-undelete": "恢復",
- "vector-action-unprotect": "更改保護",
- "vector-view-create": "建立",
- "vector-view-edit": "編寫",
- "vector-view-history": "查看歷史",
- "vector-view-view": "閱讀",
- "vector-view-viewsource": "查看源碼",
"actions": "動作",
"namespaces": "名字空間",
"variants": "變換",
"history_short": "歷史",
"updatedmarker": "亻厓上擺訪問以來嘅更新",
"printableversion": "做得印刷嘅版本",
- "permalink": "永久鏈接",
+ "permalink": "固定連結",
"print": "印刷",
"view": "查看",
"edit": "編寫",
"last": "上一隻",
"page_first": "最早",
"page_last": "最尾",
- "histlegend": "差別選擇:標記愛比較修訂版本嘅單選按鈕並點擊底部嘅按鈕進行比較。<br />\n說明:'''({{int:cur}})''' 指撈最新修訂版本比較,'''({{int:last}})''' 指撈上隻修訂版本比較,'''{{int:minoreditletter}}''' = 細微修改。",
+ "histlegend": "差別選擇:標記愛比較版本嘅單選按鈕並點擊底部嘅按鈕進行比較。<br />\n說明:'''({{int:cur}})''' 指撈最新版本比較,'''({{int:last}})''' 指撈上隻版本比較,'''{{int:minoreditletter}}''' = 細微修改。",
"history-fieldset-title": "瀏覽歷史",
"history-show-deleted": "單淨係已刪除嘅",
"histfirst": "最早",
"searchmenu-exists": "'''在邇隻wiki上已經有一頁喊做“[[:$1]]”。'''",
"searchmenu-new": "'''在本wiki上建立邇隻頁面“[[:$1]]”!'''",
"searchprofile-articles": "內容頁面",
- "searchprofile-project": "幫助撈計劃頁面",
"searchprofile-images": "多媒體",
"searchprofile-everything": "全部",
"searchprofile-advanced": "高級",
"searchprofile-articles-tooltip": "在$1肚搜尋",
- "searchprofile-project-tooltip": "在$1肚搜尋",
"searchprofile-images-tooltip": "搜尋文件",
"searchprofile-everything-tooltip": "搜索全部(包括討論頁面)",
"searchprofile-advanced-tooltip": "在用戶安名空間肚搜尋",
"servertime": "Fu̍k-vu hi-khí sṳ̀-kiên",
"guesstimezone": "從瀏覽器填寫",
"allowemail": "接受來自其他用戶嘅郵件",
- "defaultns": "Yi-sat sêu-sok ke miàng-sṳ khûng-kiên:",
"default": "默認",
"prefs-files": "文件",
"youremail": "電子郵件:",
"username": "Yung-fu miàng-chhṳ̂n:",
- "uid": "Yung-fu ID:",
"yourrealname": "真名:",
"yourlanguage": "語言:",
"yourvariant": "Sṳ-thí pien-von:",
"logempty": "在日誌肚無匹配項。",
"log-title-wildcard": "搜尋以邇隻文字開頭嘅標題",
"allpages": "全部頁面",
- "alphaindexline": "$1到$2",
"nextpage": "下一頁($1)",
"prevpage": "上一頁($1)",
"allpagesfrom": "顯示從邇處開始嘅頁面:",
"tooltip-t-upload": "上傳文件",
"tooltip-t-specialpages": "全部特殊文章嘅列表",
"tooltip-t-print": "本頁面做得打印嘅版本",
- "tooltip-t-permalink": "邇隻頁面修訂版本嘅永久鏈接",
+ "tooltip-t-permalink": "邇隻頁面版本嘅固定連結",
"tooltip-ca-nstab-main": "查看內容頁",
"tooltip-ca-nstab-user": "查看用戶頁面",
"tooltip-ca-nstab-media": "Chhà-khon hìn-thí-chông",
"tooltip-save": "保存汝嘅修改",
"tooltip-preview": "預覽汝嘅編寫,請先使用本功能後再保存!",
"tooltip-diff": "展示汝對頁面嘅貢獻",
- "tooltip-compareselectedversions": "查看本頁分點選嘅兩個修訂版本間嘅差別",
+ "tooltip-compareselectedversions": "查看本頁分點選嘅兩個版本間嘅差別",
"tooltip-watch": "加邇頁入監視列表",
"tooltip-recreate": "Chhùng-kien ke-vùn-chông, mò-lun he-feu pûn chhù-chhîn",
"tooltip-rollback": "撳“打轉頭”恢復上一位貢獻人對本頁面嘅編寫",
"tooltip-undo": "“撤銷”做得在編寫模式上開啟編輯寫表格來方便復原。其允許在摘要肚加入原因。",
"tooltip-summary": "輸入一條簡短嘅摘要",
"common.css": "/* Chhṳ́-chhu ke CSS chiông-chhiu yin-yung chhai só-yû ke mien-pán */",
- "monobook.css": "/* Chhṳ́-chhu ke CSS chiông-voi yáng-hióng sṳ́-yung Monobook mien-pán ke yung-fu */",
"common.js": "/* Chhṳ́-chhu ke JavaScript chiông chai-ngi̍p yî só-yû ying-fu mî yit-ke vùn-chông. */",
- "monobook.js": "/* Yí-kîn put-chai sṳ́-yung; chhiáng-yung [[MediaWiki:common.js]] */",
"anonymous": "{{SITENAME}} ke ngia̍k-miàng yung-fu",
"siteuser": "{{SITENAME}} Yung-fu-chá $1",
"lastmodifiedatby": "Chhṳ́-chông yù $3 yî $1 $2 ke chui-heu kiên-kói.",
"qbmyoptions": "האפשרויות שלי",
"faq": "שאלות ותשובות",
"faqpage": "Project:שאלות ותשובות",
- "vector-action-addsection": "הוספת נושא",
- "vector-action-delete": "מחיקה",
- "vector-action-move": "העברה",
- "vector-action-protect": "הגנה",
- "vector-action-undelete": "ביטול מחיקה",
- "vector-action-unprotect": "שינוי הגנה",
- "vector-view-create": "יצירה",
- "vector-view-edit": "עריכה",
- "vector-view-history": "הצגת היסטוריה",
- "vector-view-view": "קריאה",
- "vector-view-viewsource": "הצגת מקור",
"actions": "פעולות",
- "vector-more-actions": "עוד",
"namespaces": "מרחבי שם",
"variants": "גרסאות שפה",
"navigation-heading": "תפריט הניווט",
"mergehistory-empty": "אין גרסאות למיזוג.",
"mergehistory-success": "{{PLURAL:$3|גרסה אחת|$3 גרסאות}} של [[:$1]] מוזגו בהצלחה לתוך [[:$2]].",
"mergehistory-fail": "לא ניתן לבצע את מיזוג הגרסאות, אנא בדקו שנית את הגדרות הדף והזמן.",
+ "mergehistory-fail-toobig": "לא ניתן לבצע את מיזוג הגרסאות כיוון שצריך להעביר יותר גרסאות מהמגבלה, שהיא {{PLURAL:$1|גרסה אחת|֫$1 גרסאות}}.",
"mergehistory-no-source": "דף המקור $1 אינו קיים.",
"mergehistory-no-destination": "דף היעד $1 אינו קיים.",
"mergehistory-invalid-source": "דף המקור חייב להיות בעל כותרת תקינה.",
"difference-missing-revision": "{{PLURAL:$2|גרסה אחת|$2 גרסאות}} של ההבדל הזה בין שתי גרסאות ($1) {{PLURAL:$2|לא נמצאה|לא נמצאו}}.\n\nזה נגרם בדרך כלל על־ידי לחיצה על קישור ישן להבדל בין גרסאות של דף שנמחק.\nאפשר למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
"searchresults": "תוצאות החיפוש",
"searchresults-title": "תוצאות החיפוש \"$1\"",
- "toomanymatches": "יותר מדי תוצאות נמצאו, נא לנסות מילות חיפוש אחרות",
"titlematches": "כותרות דפים תואמות",
"textmatches": "דפים עם תוכן תואם",
"notextmatches": "אין דפים עם תוכן תואם",
"largefileserver": "גודל הקובץ חורג ממגבלת השרת.",
"emptyfile": "נראה שהקובץ שהעליתם ריק. ייתכן שהסיבה לכך היא שגיאת הקלדה בשם הקובץ. אנא ודאו שזהו הקובץ שברצונכם להעלות.",
"windows-nonascii-filename": "אתר ויקי זה אינו תומך בשמות קבצים עם תווים מיוחדים או תווים שאינם באנגלית.",
- "fileexists": "קובץ בשם זה כבר קיים, אנא בדקו את <strong>[[:$1]]</strong> אם אינכם בטוחים שברצונכם להחליף אותו.\n[[$1|thumb]]",
+ "fileexists": "ק×\95×\91×¥ ×\91ש×\9d ×\94×\96×\94 ×\9b×\91ר ק×\99×\99×\9d, ×\90× ×\90 ×\91×\93ק×\95 ×\90ת <strong>[[:$1]]</strong> ×\90×\9d ×\90×\99× ×\9b×\9d ×\91×\98×\95×\97×\99×\9d ש×\91רצ×\95× ×\9b×\9d ×\9c×\94×\97×\9c×\99×£ ×\90×\95ת×\95.\n[[$1|thumb]]",
"filepageexists": "דף תיאור הקובץ עבור קובץ זה כבר נוצר ב<strong>[[:$1]]</strong>, אך לא קיים קובץ בשם זה.\nתיאור הקובץ שתכתבו לא יופיע בדף תיאור הקובץ.\nכדי לגרום לו להופיע שם, יהיה עליכם לערוך אותו ידנית. [[$1|thumb]]",
- "fileexists-extension": "ק×\95×\91×¥ ×¢×\9d ש×\9d ×\93×\95×\9e×\94 ×\9b×\91ר ק×\99×\99×\9d: [[$2|thumb]]\n* ש×\9d ×\94ק×\95×\91×¥ ×\94×\9e×\95×¢×\9c×\94: <strong>[[:$1]]</strong>\n* ש×\9d ×\94ק×\95×\91×¥ ×\94ק×\99×\99×\9d: <strong>[[:$2]]</strong>\n×\90× ×\90 ×\91×\97ר×\95 ש×\9d ×\90×\97ר.",
+ "fileexists-extension": "ק×\95×\91×¥ ×¢×\9d ש×\9d ×\93×\95×\9e×\94 ×\9b×\91ר ק×\99×\99×\9d: [[$2|thumb]]\n* ש×\9d ×\94ק×\95×\91×¥ ×\94×\9e×\95×¢×\9c×\94: <strong>[[:$1]]</strong>\n* ש×\9d ×\94ק×\95×\91×¥ ×\94ק×\99×\99×\9d: <strong>[[:$2]]</strong>\n×\90×\95×\9c×\99 ×\9b×\93×\90×\99 ×\9cתת ×\9cק×\95×\91×¥ ש×\9d ספצ×\99פ×\99 ×\99×\95תר?",
"fileexists-thumbnail-yes": "הקובץ הוא כנראה תמונה מוקטנת (ממוזערת). [[$1|thumb]]\nאנא בדקו את הקובץ <strong>[[:$1]]</strong>.\nאם הקובץ שבדקתם הוא אותה התמונה בגודל מקורי, אין זה הכרחי להעלות גם תמונה ממוזערת.",
"file-thumbnail-no": "שם הקובץ מתחיל עם <strong>$1</strong>. נראה שזוהי תמונה מוקטנת (ממוזערת).\nאם התמונה בגודל מלא מצויה ברשותכם, אנא העלו אותה ולא את התמונה הממוזערת; אחרת, אנא שנו את שם הקובץ.",
"fileexists-forbidden": "קובץ בשם זה כבר קיים, ואינכם יכולים להחליף אותו.\nאם אתם עדיין מעוניינים להעלות קובץ זה, אנא חזרו לדף הקודם והעלו את הקובץ תחת שם חדש.\n[[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "אפשרות המחיקה והשחזור של קבצים מבוטלת זמנית עקב פעולת תחזוקה.",
"filedelete-maintenance-title": "לא ניתן למחוק את הקובץ",
"mimesearch": "חיפוש MIME",
- "mimesearch-summary": "×\93×£ ×\96×\94 ×\9e×\90פשר ×\90ת ס×\99× ×\95×\9f ×\94ק×\91צ×\99×\9d ×\9cפ×\99 ס×\95×\92 ×\94Ö¾MIME ש×\9c×\94×\9d.\nס×\95×\92 ×\94Ö¾MIME ×\91× ×\95×\99 ×\91צ×\95ר×\94 \"ס×\95×\92 ת×\95×\9b×\9f/ס×\95×\92 ×\9e×©× ×\99\", ×\9c×\93×\95×\92×\9e×\94 <code>image/jpeg</code>.",
+ "mimesearch-summary": "×\93×£ ×\96×\94 ×\9e×\90פשר ×\9c×¡× ×\9f ק×\91צ×\99×\9d ×\9cפ×\99 ס×\95×\92 ×\94Ö¾MIME ש×\9c×\94×\9d.\nק×\9c×\98: contenttype/subtype ×\90×\95 <span dir=\"ltr\">contenttype/*</span>, ×\9c×\9eש×\9c <code>image/jpeg</code>.",
"mimetype": "סוג MIME:",
"download": "הורדה",
"unwatchedpages": "דפים שאינם במעקב",
"tooltip-preferences-save": "שמירת ההעדפות",
"tooltip-summary": "להכנסת תקציר קצר",
"common.css": "/* הסגנונות הנכתבים כאן ישפיעו על כל העיצובים */",
- "monobook.css": "/* הסגנונות הנכתבים כאן ישפיעו על העיצוב MonoBook בלבד */",
- "vector.css": "/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Vector בלבד */",
"print.css": "/* הסגנונות הנכתבים כאן ישפיעו על הפלט בהדפסה בלבד */",
"noscript.css": "/* הסגנונות הנכתבים כאן ישפיעו על משתמשים עם JavaScript מבוטל */",
"group-autoconfirmed.css": "/* הסגנונות הנכתבים כאן ישפיעו על משתמשים ותיקים בלבד */",
"group-sysop.css": "/* הסגנונות הנכתבים כאן ישפיעו על מפעילי מערכת בלבד */",
"group-bureaucrat.css": "/* הסגנונות הנכתבים כאן ישפיעו על ביורוקרטים בלבד */",
"common.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ עבור כל המשתמשים בכל טעינת עמוד */",
- "monobook.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Monobook */",
- "vector.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Vector */",
"group-autoconfirmed.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ עבור משתמשים ותיקים בלבד */",
"group-user.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ עבור משתמשים רשומים בלבד */",
"group-bot.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ עבור בוטים בלבד */",
"pageinfo-category-pages": "מספר הדפים",
"pageinfo-category-subcats": "מספר קטגוריות המשנה",
"pageinfo-category-files": "מספר הקבצים",
- "skinname-monobook": "מונובוק",
- "skinname-vector": "וקטור",
"markaspatrolleddiff": "סימון השינוי כבדוק",
"markaspatrolledtext": "סימון דף זה כבדוק",
"markedaspatrolled": "השינוי סומן כבדוק",
"version-hook-name": "שם ה־Hook",
"version-hook-subscribedby": "הפונקציה הרושמת",
"version-version": "($1)",
+ "version-no-ext-name": "[ללא שם]",
"version-license": "רישיון עבור מדיה־ויקי",
"version-ext-license": "רישיון",
"version-ext-colheader-name": "הרחבה",
"qbmyoptions": "मेरे पृष्ठ",
"faq": "बहुधा पूछे प्रश्न",
"faqpage": "Project:अक्सर पूछे जाने वाले सवाल",
- "vector-action-addsection": "विषय जोड़ें",
- "vector-action-delete": "हटाएँ",
- "vector-action-move": "स्थानांतरण करें",
- "vector-action-protect": "सुरक्षित करें",
- "vector-action-undelete": "हटाना वापस लें",
- "vector-action-unprotect": "सुरक्षा बदलें",
- "vector-view-create": "बनाएँ",
- "vector-view-edit": "सम्पादन",
- "vector-view-history": "इतिहास देखें",
- "vector-view-view": "पढ़ें",
- "vector-view-viewsource": "स्रोत देखें",
"actions": "क्रियाएँ",
"namespaces": "नामस्थान",
"variants": "संस्करण",
"difference-missing-revision": "इस अंतर {{PLURAL:$2|का एक अवतरण|के $2 अवतरण}} ($1) नहीं {{PLURAL:$2|पाया गया|पाए गए}}।\n\nयह आम तौर पर एक हटाए गए पृष्ठ के अवतरणों में अंतर ढूँढने पर होता है। अधिक जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाने के लॉग] में पायी जा सकती है।",
"searchresults": "खोज परिणाम",
"searchresults-title": "\"$1\" के लिए खोज परिणाम",
- "toomanymatches": "अत्यधिक जवाब मिले हैं, कृपया खोजशब्द बदलें",
"titlematches": "पृष्ठ शीर्षक मिलान",
"textmatches": "पृष्ठ पाठ मिलान",
"notextmatches": "किसी भी पृष्ठ में यह सामग्री नहीं मिली",
"tooltip-preferences-save": "वरीयताएं सहेजें",
"tooltip-summary": "एक संक्षिप्त सारांश दर्ज करें",
"common.css": "/* यहां रखी css सभी त्वचाओंपर असर करेगी */",
- "monobook.css": "/* यहां रखी गई css मोनोबुक त्वचा का इस्तेमाल करने वाले सभी सदस्योंपर असर करेगी */",
"common.js": "/* यहां लिखी गई जावास्क्रीप्ट सभी सदस्योंके लिये इस्तेमाल में लाई जायेगी। */",
- "monobook.js": "/* यहाँ पर दी गई जावास्क्रिप्ट मोनोबुक त्वचा का प्रयोग कर रहे सदस्यों के लिए लोड होगी */",
"anonymous": "{{SITENAME}} के {{PLURAL:$1||}} बेनामी सदस्य",
"siteuser": "विकिपीडिया सदस्य $1",
"anonuser": "{{SITENAME}} अज्ञात उपयोगकर्ता $1",
"qbmyoptions": "Moje stranice",
"faq": "Najčešća pitanja",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Dodaj temu",
- "vector-action-delete": "Izbriši",
- "vector-action-move": "Premjesti",
- "vector-action-protect": "Zaštiti",
- "vector-action-undelete": "Vrati",
- "vector-action-unprotect": "Promijeni zaštitu",
- "vector-view-create": "Započni",
- "vector-view-edit": "Uredi",
- "vector-view-history": "Vidi stare izmjene",
- "vector-view-view": "Čitaj",
- "vector-view-viewsource": "Vidi izvor",
"actions": "Radnje",
"namespaces": "Imenski prostori",
"variants": "Inačice",
"nstab-media": "Mediji",
"nstab-special": "Posebna stranica",
"nstab-project": "Stranica o projektu",
- "nstab-image": "Slika",
+ "nstab-image": "Datoteka",
"nstab-mediawiki": "Poruka",
"nstab-template": "Predložak",
"nstab-help": "Pomoć",
"edit-gone-missing": "Stranica nije spremljena.\nČini se kako je obrisana.",
"edit-conflict": "Sukob uređivanja.",
"edit-no-change": "Vaše uređivanje je zanemareno, jer nikakva promjena sadržaja nije napravljena.",
+ "postedit-confirmation-created": "Stranica je stvorena.",
"postedit-confirmation-saved": "Vaše je uređivanje sačuvano.",
"edit-already-exists": "Neuspješno stvaranje nove stranice.\nStranica već postoji.",
"defaultmessagetext": "Prvotni tekst poruke",
"difference-missing-revision": "{{PLURAL:$2|Uređivanje|$2 uređivanja}} sljedeće šifre ($1) ne {{PLURAL:$2|postoji|postoje}}.\n\nOvo je obično uzrokovano kada kliknete na zastarjelu poveznicu na stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} evidenciji brisanja].",
"searchresults": "Rezultati pretrage",
"searchresults-title": "Rezultati traženja za \"$1\"",
- "toomanymatches": "Preveliki broj rezultata, molimo probajte drukčiji upit",
"titlematches": "Pronađene stranice prema naslovu",
"textmatches": "Pronađene stranice prema tekstu članka",
"notextmatches": "Nema pronađenih stranica prema tekstu članka",
"uploadwarning": "Upozorenje kod postavljanja",
"uploadwarning-text": "Molimo izmijenite opis datoteke ispod i pokušajte kasnije.",
"savefile": "Sačuvaj datoteku",
- "uploadedimage": "postavljeno \"$1\"",
+ "uploadedimage": "je postavio \"$1\"",
"overwroteimage": "postavljena nova inačica od \"[[$1]]\"",
"uploaddisabled": "Postavljanje je onemogućeno",
"copyuploaddisabled": "Postavljanje URL-om onemogućeno.",
"listgrouprights-removegroup-self": "Ukloni {{PLURAL:$2|skupinu|skupine}} iz vlastitog računa: $1",
"listgrouprights-addgroup-self-all": "Dodaj sve skupine vlastitom računu",
"listgrouprights-removegroup-self-all": "Uklonite sve skupine iz vlastitog računa",
+ "trackingcategories-nodesc": "Opis nije dostupan.",
"mailnologin": "Nema adrese pošiljaoca",
"mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]]\ni imati valjanu adresu e-pošte u svojim [[Special:Preferences|postavkama]]\nda bi mogli slati poštu drugim suradnicima.",
"emailuser": "Pošalji mu e-poruku",
"delete_and_move": "Izbriši i premjesti",
"delete_and_move_text": "==Nužno brisanje==\n\nOdredišni članak \"[[:$1]]\" već postoji. Želite li ga obrisati da biste napravili mjesto za premještaj?",
"delete_and_move_confirm": "Da, izbriši stranicu",
- "delete_and_move_reason": "Obrisano kako bi se napravilo mjesta za premještaj, stari naziv \"[[$1]]\"",
+ "delete_and_move_reason": "obrisano kako bi se napravilo mjesto za premještaj, stari naziv \"[[$1]]\"",
"selfmove": "Izvorni i odredišni naslov su isti; ne mogu premjestiti stranicu na nju samu.",
"immobile-source-namespace": "Ne mogu premjestiti stranice u imenski prostor \"$1\"",
"immobile-target-namespace": "Ne mogu premjestiti stranice u imenski prostor \"$1\"",
"tooltip-preferences-save": "Spremi postavke",
"tooltip-summary": "Unesite kratki sažetak",
"common.css": "/** Uređivanje ove CSS datoteke će se odraziti na sve skinove */",
- "monobook.css": "/** Ovdje idu izmjene monobook stylesheeta */",
"common.js": "/* JavaScript kod na ovoj stranici će biti izvršen kod svakog suradnika pri svakom učitavanju svake stranice wikija. */",
- "monobook.js": "/* Ne rabi se više; molimo rabite [[MediaWiki:common.js]] */",
"anonymous": "Neprijavljeni {{PLURAL:$1|suradnik|suradnici}} projekta {{SITENAME}}",
"siteuser": "Suradnik $1 na projektu {{SITENAME}}",
"anonuser": "{{SITENAME}} anonimni suradnik $1",
"pageinfo-category-pages": "Broj stranica",
"pageinfo-category-subcats": "Broj podkategorija",
"pageinfo-category-files": "Broj datoteka",
- "skinname-monobook": "MonoBook",
"markaspatrolleddiff": "Označi za pregledano",
"markaspatrolledtext": "Označi ovaj članak pregledanim",
"markedaspatrolled": "Pregledano",
"api-error-mustbeloggedin": "Morate biti prijavljeni da bi mogli postavljati datoteke.",
"api-error-mustbeposted": "Postoji pogreška u ovom softveru; ne rabi ispravnu HTTP metodu.",
"api-error-noimageinfo": "Postavljanje je uspjelo, ali poslužitelj nije vratio nikakvu informaciju o datoteci.",
- "api-error-nomodule": "Interna pogrješka: Nije postavljen modul za postavljanje.",
- "api-error-ok-but-empty": "Interna pogrješka: Nema odgovora od poslužitelja.",
+ "api-error-nomodule": "Interna pogrješka: nije postavljen modul za postavljanje.",
+ "api-error-ok-but-empty": "Interna pogrješka: nema odgovora od poslužitelja.",
"api-error-overwrite": "Postavljanje preko postojeće datoteke nije dopušteno.",
"api-error-stashfailed": "Interna pogrješka: Poslužitelj nije uspio spremiti privremenu datoteku.",
- "api-error-publishfailed": "Interna pogrješka: Poslužitelj nije uspio objaviti privremenu datoteku.",
+ "api-error-publishfailed": "Interna pogrješka: poslužitelj nije uspio objaviti privremenu datoteku.",
"api-error-timeout": "Poslužitelj nije odgovorio unutar očekivanog vrjemena.",
"api-error-unclassified": "Dogodila se nepoznata pogrješka.",
"api-error-unknown-code": "Nepoznata pogrješka: \"$1\"",
- "api-error-unknown-error": "Interna pogrješka: Dogodila se pogrješka pri pokušaju postavljanja vaše datoteke.",
+ "api-error-unknown-error": "Interna pogrješka: dogodila se pogrješka pri pokušaju postavljanja vaše datoteke.",
"api-error-unknown-warning": "Nepoznato upozorenje: $1",
"api-error-unknownerror": "Nepoznata pogrješka: \"$1\"",
"api-error-uploaddisabled": "Postavljanje datoteka je onemogućeno na ovom wikiprojektu.",
"qbmyoptions": "Meine Seite",
"faq": "Häifich gestellte Froche",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Abschnitt hinzufüche",
- "vector-action-delete": "Lösche",
- "vector-action-move": "Verschiebe",
- "vector-action-protect": "Schütz",
- "vector-action-undelete": "Wiederherstelle",
- "vector-action-unprotect": "Seiteschutz ännre",
- "vector-view-create": "Erstell",
- "vector-view-edit": "Beoorbeite",
- "vector-view-history": "Versionsgeschicht",
- "vector-view-view": "Lese",
- "vector-view-viewsource": "Quelltext oonzeiche",
"actions": "Aktione",
"namespaces": "Noomeräume",
"variants": "Variante",
"difference-missing-revision": "{{PLURAL:$2|Ein Version|$2 Versione}} der Unnerschiedsoonzeich ($1) {{PLURAL:$2|woard|worre}} net gefund.\n\nDer Fehler weard normalerweis von en veraltete Link zur Versionsgeschicht von en Seit verursacht, wo zwischichzeitlich abgewischt woard.\nEinzelheite sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Abwasch-Logbuch] voarhand.",
"searchresults": "Suchergebnisse",
"searchresults-title": "Suchergebnisse für „$1“",
- "toomanymatches": "Die Oonzoohl von der Suchergebnisse ist zu gross, bittschön versuch en annre Abfroch.",
"titlematches": "Üwereinstimmunge mit Seitetitle",
"textmatches": "Üwereinstimmunge mit Inhalte",
"notextmatches": "Ken Üwereinstimmunge mit Inhalte",
"qbmyoptions": "Moje strony",
"faq": "Husto stajene prašenja (FAQ)",
"faqpage": "Project:Husto stajene prašenja (FAQ)",
- "vector-action-addsection": "Temu přidać",
- "vector-action-delete": "wušmórnyć",
- "vector-action-move": "přesunyć",
- "vector-action-protect": "škitać",
- "vector-action-undelete": "Wobnowić",
- "vector-action-unprotect": "Škit wotstronić",
- "vector-view-create": "Wutworić",
- "vector-view-edit": "Wobdźěłać",
- "vector-view-history": "Stawizny",
- "vector-view-view": "Čitać",
- "vector-view-viewsource": "Žórło sej wobhladać",
"actions": "Akcije",
- "vector-more-actions": "Wjace",
"namespaces": "Mjenowe rumy",
"variants": "Warianty",
"navigation-heading": "Nawigaciski meni",
"difference-missing-revision": "{{PLURAL:$2|Jedna wersija|$2 wersiji|$2 wersije|$2 wersijow}} tutoho rozdźěla ($1) {{PLURAL:$2|njeje so namakała|njejstej so namakałoj|njejsu namakali|njeje so namakało}}.\n\nPřičina je zwjetša zestarjeny diferencny wotkaz k stronje, kotraž je so zhašała.\nPodrobnosće móžeš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokolu wušmórnjenjow] namakać.",
"searchresults": "Pytanske wuslědki",
"searchresults-title": "Pytanske wuslědki za \"$1\"",
- "toomanymatches": "Přewjele pytanskich wuslědkow, prošu spytaj druhe wotprašenje.",
"titlematches": "Strony z wotpowědowacym titulom",
"textmatches": "Strony z wotpowědowacym tekstom",
"notextmatches": "Žane strony z wotpowědowacym tekstom",
"largefileserver": "Dataja je wjetša hač serwer dowoluje.",
"emptyfile": "Dataja, kotruž sy nahrał, zda so prózdna być. Z přičinu móhł pisanski zmylk w mjenje dataje być. Prošu pruwuj hač chceš ju woprawdźe nahrać.",
"windows-nonascii-filename": "Tutón wiki datajowe mjena ze specialnymi znamješkami njepodpěruje.",
- "fileexists": "Dataja z tutym mjenom hižo eksistuje.\nJeli kliknješ na „Składować”, so wona přepisuje.\nProšu pruwuj <strong>[[:$1]]</strong> jeli njejsy wěsty hač chceš ju změnić.\n[[$1|thumb]]",
+ "fileexists": "Dataja z tutym mjenom hižo eksistuje, prošu pruwuj <strong>[[:$1]]</strong>, jeli {{GENDER:|njejsy}} wěsty, hač chceš ju změnić.\n[[$1|thumb]]",
"filepageexists": "Wopisanska strona za tutu dataju bu hižo pola <strong>[[:$1]]</strong> wutworjena,\nale tuchwilu dataja z tutym mjenom njeeksistuje.\nZjeće, kotrež zapodaš, njebudźe so na wopisanskej stronje jewić.\nZo by so twoje zjeće tam jewiło, dyrbiš ju manuelnje wobdźěłać.\n[[$1|thumb]]",
- "fileexists-extension": "Dataja z podobnym mjenom hižo eksistuje: [[$2|thumb]]\n* Mjeno dataje, kotruž chceš nahrać: <strong>[[:$1]]</strong>\n* Mjeno eksistowaceje dataje: <strong>[[:$2]]</strong>\nProšu wubjer druhe mjeno.",
+ "fileexists-extension": "Dataja z podobnym mjenom hižo eksistuje: [[$2|thumb]]\n* Mjeno dataje, kotruž chceš nahrać: <strong>[[:$1]]</strong>\n* Mjeno eksistowaceje dataje: <strong>[[:$2]]</strong>\nChceš snano mjeno wužiwać, kotrež so wjace rozeznawa?",
"fileexists-thumbnail-yes": "Dataja zda so minaturka ''(thumbnail)'' być. [[$1|thumb]]\nProšu přepruwuj dataju <strong>[[:$1]]</strong>.\nJeli je to wobraz w originalnej wulkosći, njetrjebaš minaturku nahrać.",
"file-thumbnail-no": "Mjeno dataje započina so z <strong>$1</strong>. Zda so, zo to je wobraz z redukowanej wulkosću ''(thumbnail)'' pokazać.\nJeli maš tutón wobraz z połnym rozeznaćom, nahraj tutón, hewak změń prošu datajowe mjeno.",
"fileexists-forbidden": "Dataja z tutym mjenom hižo eksistuje a njeda so přepisać. Jeli hišće chceš swoju dataju nahrać, dźi prošu wróćo a wuž nowe mjeno. [[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "Wušmórnjenje a wobnowjenje datajow stej wothladowanja dla nachilu znjemóžnjenej.",
"filedelete-maintenance-title": "Dataja njeda so zhašeć",
"mimesearch": "Pytanje za typom MIME",
- "mimesearch-summary": "Na tutej specialnej stronje hodźa so dataje po typje MIME filtrować. Dyrbiš přeco typ MIME a podtyp zapodać: <code>image/jpeg</code> (hlej stronu z wopisanjom wobraza).",
+ "mimesearch-summary": "Na tutej specialnej stronje hodźa so dataje po typje MIME filtrować.\nZapodaće: contenttype/subtype abo contenttype/*, na př. <code>image/jpeg</code>.",
"mimetype": "Typ MIME:",
"download": "Sćahnyć",
"unwatchedpages": "Njewobkedźbowane strony",
"tooltip-summary": "Zapodaj krótke zjeće",
"interlanguage-link-title": "$1 – $2",
"common.css": "/* CSS w tutej dataji budźe so na wšěch stronow wuskutkować. */",
- "monobook.css": "/* CSS wobdźěłać, zo by so skin „monobook” za wšěčh wužiwarjow tutoho skina priměrił */",
"common.js": "/* Kóždy JavaScript tu so za wšěch wužiwarjow při kóždym zwobraznjenju někajkeje strony začita. */",
- "monobook.js": "/* Slědowacy JavaScript začita so za wužiwarjow, kotřiž šat MonoBook wužiwaja */",
"anonymous": "{{PLURAL:$1|Anonymny wužiwar|Anonymnaj wužiwarjej|Anonymni wužiwarjo|Anonymni wužiwarjo}} we {{GRAMMAR:lokatiw|{{SITENAME}}}}",
"siteuser": "wužiwarja $1 na {{GRAMMAR:lokatiw|{{SITENAME}}}}",
"anonuser": "anonymny wužiwar $1 na {{GRAMMAR:lokatiw|{{SITENAME}}}}",
"pageinfo-category-pages": "Ličba rěkow",
"pageinfo-category-subcats": "Ličba podkategorijow",
"pageinfo-category-files": "Ličba datajow",
- "skinname-monobook": "MonoBook",
"markaspatrolleddiff": "Změnu jako přepruwowanu woznamjenić",
"markaspatrolledtext": "Tutu změnu nastawka jako přepruwowanu woznamjenić",
"markedaspatrolled": "Změna bu jako přepruwowana woznamjenjena.",
"qbmyoptions": "Lapjaim",
"faq": "GyIK",
"faqpage": "Project:GyIK",
- "vector-action-addsection": "Új téma nyitása",
- "vector-action-delete": "Törlés",
- "vector-action-move": "Átnevezés",
- "vector-action-protect": "Lapvédelem",
- "vector-action-undelete": "Visszaállítás",
- "vector-action-unprotect": "Védelem módosítása",
- "vector-view-create": "Létrehozás",
- "vector-view-edit": "Szerkesztés",
- "vector-view-history": "Laptörténet",
- "vector-view-view": "Olvasás",
- "vector-view-viewsource": "A lap forrása",
"actions": "Műveletek",
- "vector-more-actions": "Több",
"namespaces": "Névterek",
"variants": "Változatok",
"navigation-heading": "Navigációs menü",
"currentrev": "Aktuális változat",
"currentrev-asof": "A lap jelenlegi, $1-kori változata",
"revisionasof": "A lap $1-kori változata",
- "revision-info": "A lap korábbi változatát látod, amilyen $2 $1-kor történt szerkesztése után volt.",
+ "revision-info": "A lap korábbi változatát látod, amilyen {{GENDER:$6|$2}} $1-kor történt szerkesztése$7 után volt.",
"previousrevision": "←Régebbi változat",
"nextrevision": "Újabb változat→",
"currentrevisionlink": "Aktuális változat",
"difference-missing-revision": "A(z) \"{{PAGENAME}}\" nevű oldal #$1 $2 változata nem létezik.\n\nEzt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás használata okozza. Részletek a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} törlési naplóban] találhatóak.",
"searchresults": "A keresés eredménye",
"searchresults-title": "Keresési eredmények: „$1”",
- "toomanymatches": "Túl sok találat van, próbálkozz egy másik lekérdezéssel",
"titlematches": "Címbeli egyezések",
"textmatches": "Szövegbeli egyezések",
"notextmatches": "Nincsenek szövegbeli egyezések",
"shown-title": "{{PLURAL:$1|Egy|$1}} találat laponként",
"viewprevnext": "($1 {{int:pipe-separator}} $2) ($3)",
"searchmenu-exists": "'''A wikin már van „[[:$1]]” nevű lap'''",
- "searchmenu-new": "'''Hozd létre a(z) „[[:$1]]” nevű lapot ezen a wikin!'''",
+ "searchmenu-new": "<strong>Hozd létre a(z) „[[:$1]]” nevű lapot ezen a wikin!</strong>\n{{PLURAL:$2|0=|Lásd még a keresés során talált lapot.|Lásd még a keresés eredményét.}}",
"searchprofile-articles": "Tartalmi oldalak",
"searchprofile-images": "Médiafájlok",
"searchprofile-everything": "Minden lap",
"filedelete-maintenance": "A fájlok törlése és helyreállítása ideiglenesen le van tiltva karbantartás miatt.",
"filedelete-maintenance-title": "Nem lehet törölni a fájlt",
"mimesearch": "Keresés MIME-típus alapján",
- "mimesearch-summary": "Ez az oldal engedélyezi a fájlok MIME-típus alapján történő szűrését. Bevitel: tartalomtípus/altípus, pl. <code>image/jpeg</code>.",
+ "mimesearch-summary": "Ez az oldal engedélyezi a fájlok MIME-típus alapján történő szűrését. Bevitel: tartalomtípus/altípus vagy tartalomtípus/*, pl. <code>image/jpeg</code>.",
"mimetype": "MIME-típus:",
"download": "letöltés",
"unwatchedpages": "Nem figyelt lapok",
"doubleredirects": "Dupla átirányítások",
"doubleredirectstext": "Ez a lap azokat a lapokat listázza, melyek átirányító lapokra irányítanak át.\nMinden sor tartalmaz egy hivatkozást az első, valamint a második átirányításra, valamint a második átirányítás céljára, ami általában a valódi céllap, erre kellene az első átirányításnak mutatnia.\nAz <del>áthúzott</del> sorok a lista elkészülése óta javítva lettek.",
"double-redirect-fixed-move": "[[$1]] átnevezve, a továbbiakban átirányításként működik a(z) [[$2]] lapra",
- "double-redirect-fixed-maintenance": "[[$1]] dupla átirányítás javítása a következőre: [[$2]]",
+ "double-redirect-fixed-maintenance": "[[$1]] dupla átirányítás automatikus javítása karbantartás során a következőre: [[$2]]",
"double-redirect-fixer": "Átirányításjavító",
"brokenredirects": "Nem létező lapra mutató átirányítások",
"brokenredirectstext": "A következő átirányítások nem létező lapokra hivatkoznak:",
"undeleteextrahelp": "A lap teljes helyreállításához ne jelölj be egy jelölőnégyzetet sem, csak kattints a '''''{{int:undeletebtn}}''''' gombra.\nA lap részleges helyreállításához jelöld be a kívánt változatok melletti jelölőnégyzeteket, és kattints a '''''{{int:undeletebtn}}''''' gombra.",
"undeleterevisions": "{{PLURAL:$1|egy|$1}} változat archiválva",
"undeletehistory": "Ha helyreállítasz egy lapot, azzal visszahozod laptörténet összes változatát.\nHa lap törlése óta azonos néven már létrehoztak egy újabb lapot, a helyreállított\nváltozatok a laptörténet végére kerülnek be, a jelenlegi lapváltozat módosítása nélkül.",
- "undeleterevdel": "A visszavonás nem hajtható végre, ha a legfrissebb lapváltozat részben\ntörlését eredmémyezi. Ilyen esetekben törölnöd kell a legújabb törölt változatok kijelölését, vagy megszüntetni az elrejtésüket. Azon fájlváltozatok,\nmelyek megtekintése a számodra nem engedélyezett, nem kerülnek visszaállításra.",
+ "undeleterevdel": "A törlés visszavonása nem hajtható végre, ha a legfrissebb lapváltozat részleges törlését eredményezi.\nIlyen esetekben vissza kell vonnod a legújabb törölt változatok kijelölését vagy azok elrejtését.",
"undeletehistorynoadmin": "Ezt a szócikket törölték. A törlés okát alább az összegzésben\nláthatod, az oldalt a törlés előtt szerkesztő felhasználók részleteivel együtt. Ezeknek\na törölt változatoknak a tényleges szövege csak az adminisztrátorok számára hozzáférhető.",
"undelete-revision": "$1 $4, $5-kori törölt változata (szerző: $3).",
"undeleterevision-missing": "Érvénytelen vagy hiányzó változat. Lehet, hogy rossz hivatkozásod van, ill. a\nváltozatot visszaállították vagy eltávolították az archívumból.",
"tooltip-undo": "„Visszavonás”: visszavonja ezt a szerkesztést, valamint megnyitja a szerkesztőt előnézet módban. A szerkesztési összefoglalóban meg lehet adni a visszavonás okát.",
"tooltip-preferences-save": "Beállítások mentése",
"tooltip-summary": "Adj meg egy rövid összefoglalót",
+ "interlanguage-link-title-nonlang": "$1 – $2",
"common.css": "/* Közös CSS az összes felületnek */",
- "monobook.css": "/* Az ide elhelyezett CSS hatással lesz a Monobook felület használóira */",
- "vector.css": "/* Az ide elhelyezett CSS hatással lesz a Vector felület használóira */",
"print.css": "/* Az ide elhelyezett CSS hatással lesz a nyomtatás kimenetelére */",
"noscript.css": "/* Az ide elhelyezett CSS azon felhasználókra lesz hatással, ahol a JavaScript le van tiltva */",
"group-autoconfirmed.css": "/* Az ide elhelyezett CSS az automatikusan megerősített felhasználókra lesz hatással */",
"group-sysop.css": "/* Az ide elhelyezett CSS csak adminisztrátorokra lesz hatással */",
"group-bureaucrat.css": "/* Az ide elhelyezett CSS csak bürokratákra lesz hatással */",
"common.js": "/* Az ide elhelyezett JavaScript kód minden felhasználó számára lefut az oldalak betöltésekor. */",
- "monobook.js": "/* A Monobook felületet használó szerkesztők számára betöltendő JavaScriptek */",
- "vector.js": "/* A Vector felületet használó szerkesztők számára betöltendő JavaScriptek */",
"group-autoconfirmed.js": "/* Az ide elhelyezett JavaScript csak automatikusan megerősített felhasználóknak töltődik be */",
"group-bot.js": "/* Az ide elhelyezett JavaScript csak botoknak töltődik be */",
"group-sysop.js": "/* Az ide elhelyezett JavaScript csak adminisztrátoroknak töltődik be */",
"pageinfo-category-pages": "Lapok száma",
"pageinfo-category-subcats": "Alkategóriák száma",
"pageinfo-category-files": "Fájlok száma",
- "skinname-monobook": "MonoBook",
"markaspatrolleddiff": "Ellenőrzöttnek jelölöd",
"markaspatrolledtext": "Ellenőriztem",
"markedaspatrolled": "Ellenőrzöttnek jelölve",
"qbmyoptions": "Իմ էջերը",
"faq": "ՀՏՀ",
"faqpage": "Project:ՀՏՀ",
- "vector-action-addsection": "Ավելացնել քննարկում",
- "vector-action-delete": "Ջնջել",
- "vector-action-move": "Տեղափոխել այս էջը",
- "vector-action-protect": "Պաշտպանել",
- "vector-action-undelete": "Վերականգնել",
- "vector-action-unprotect": "Փոխել պաշտպանումը",
- "vector-view-create": "Ստեղծել",
- "vector-view-edit": "Խմբագրել",
- "vector-view-history": "Դիտել պատմությունը",
- "vector-view-view": "Կարդալ",
- "vector-view-viewsource": "Դիտել ելատեքստը",
"actions": "Գործողություններ",
"namespaces": "Անվանատարածքներ",
"variants": "Տարբերակներ",
"tooltip-rollback": "Մեկ սեղմումով հետ շրջել վերջին մասնակցի կատարած բոլոր խմբագրումները",
"tooltip-undo": "Հետ շրջել կատարված փոփոխությունը և բացել խմբագրման ձևը նախադիտման ռեժիմով՝ թույլ տալով ավելացնել հետ շրջման պատճառը։",
"common.css": "/** Այստեղ տեղադրված CSS կոդը կկիրառվի բոլոր տեսքերի վրա */",
- "monobook.css": "/* Այստեղ տեղադրված CSS կոդը կկիրառվի Monobook տեսքի վրա*/",
"common.js": "/* Այստեղ տեղադրված JavaScript կոդը կբեռնվի բոլոր մասնակիցների համար էջերի բոլոր դիմումների ժամանակ */",
- "monobook.js": "/* Հնացած է. օգտագործեք [[MediaWiki:common.js]] */",
"anonymous": "{{SITENAME}}ի անանուն {{PLURAL:$1|մասնակից|մասնակիցներ}}",
"siteuser": "{{grammar:genitive|{{SITENAME}}}} մասնակից $1",
"lastmodifiedatby": "Այս էջը վերջին անգամ փոփոխվել է ժամը $2-ին, $1 թվին՝ $3 մասնակցի կողմից։",
"pageinfo-contentpage": "Հաշվառված որպես բովանդակային էջ",
"pageinfo-contentpage-yes": "Այո",
"pageinfo-protect-cascading-yes": "Այո",
- "skinname-monobook": "ՄիաԳիրք",
- "skinname-vector": "Սովորական",
"markaspatrolleddiff": "Նշել որպես ստուգված",
"markaspatrolledtext": "Նշել այս էջը որպես ստուգված",
"markedaspatrolled": "Նշված է որպես ստուգված",
"qbmyoptions": "Mi paginas",
"faq": "FAQ",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Adder topico",
- "vector-action-delete": "Deler",
- "vector-action-move": "Renominar",
- "vector-action-protect": "Proteger",
- "vector-action-undelete": "Restaurar",
- "vector-action-unprotect": "Cambiar protection",
- "vector-view-create": "Crear",
- "vector-view-edit": "Modificar",
- "vector-view-history": "Vider historia",
- "vector-view-view": "Leger",
- "vector-view-viewsource": "Vider texto fonte",
"actions": "Actiones",
- "vector-more-actions": "Plus",
"namespaces": "Spatios de nomines",
"variants": "Variantes",
"navigation-heading": "Menu de navigation",
"difference-missing-revision": "{{PLURAL:$2|Un version|$2 versiones}} de iste differentia ($1) non ha essite trovate.\n\nIsto es generalmente causate per sequer un ligamine de diff obsolete a un pagina que ha essite delite.\nDetalios se trova in le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de deletiones].",
"searchresults": "Resultatos del recerca",
"searchresults-title": "Resultatos del recerca de \"$1\"",
- "toomanymatches": "Se retornava troppo de resultatos. Per favor prova un altere consulta.",
"titlematches": "Correspondentias in le titulos de paginas",
"textmatches": "Resultatos in le texto de paginas",
"notextmatches": "Nulle resultato in le texto de paginas",
"largefileserver": "Le grandor de iste file excede le limite configurate in le servitor.",
"emptyfile": "Le file que tu incargava pare esser vacue.\nIsto pote esser debite a un error in le nomine del file.\nPer favor verifica que tu realmente vole incargar iste file.",
"windows-nonascii-filename": "Iste wiki non supporta nomines de file con characteres special.",
- "fileexists": "Un file con iste nomine existe ja.\nPer favor verifica <strong>[[:$1]]</strong> si tu non es secur de voler cambiar lo.\n[[$1|thumb]]",
+ "fileexists": "Un file con iste nomine existe jam.\nPer favor verifica <strong>[[:$1]]</strong> si {{GENDER:|tu}} non es secur de voler cambiar lo.\n[[$1|thumb]]",
"filepageexists": "Le pagina de description correspondente a iste file ha ja essite create a <strong>[[:$1]]</strong>, ma nulle file con iste nomine existe al momento.\nLe summario que tu entra non apparera in le pagina de description.\nSi tu vole que illo appare, tu debe inserer lo manualmente.\n[[$1|thumb]]",
"fileexists-extension": "Un file con un nomine similar existe ja: [[$2|thumb]]\n* Nomine del file a incargar: <strong>[[:$1]]</strong>\n* Nomine del file existente: <strong>[[:$2]]</strong>\nPer favor selige un altere nomine.",
"fileexists-thumbnail-yes": "Iste file pare esser un imagine a grandor reducite ''(miniatura)''. [[$1|thumb]]\nPer favor verifica le file <strong>[[:$1]]</strong>.\nSi le file verificate es le mesme imagine a grandor original, non es necessari incargar un miniatura additional.",
"wantedtemplates": "Patronos desirate",
"mostlinked": "Paginas le plus ligate",
"mostlinkedcategories": "Categorias le plus ligate",
- "mostlinkedtemplates": "Patronos le plus utilisate",
+ "mostlinkedtemplates": "Paginas le plus transcludite",
"mostcategories": "Paginas con le plus categorias",
"mostimages": "Files le plus utilisate",
"mostinterwikis": "Paginas con le plus interwikis",
"tooltip-summary": "Entra un curte summario",
"interlanguage-link-title": "$1 (in $2)",
"common.css": "/* Le CSS placiate hic se applicara a tote le stilos */",
- "monobook.css": "/* Le CSS placiate hic afficera le usatores del apparentia MonoBook */",
- "vector.css": "/* Le CSS placiate hic afficera le usatores del apparentia Vector */",
"print.css": "/* Le CSS placiate hic influentiara le apparentia del paginas imprimite */",
"common.js": "/* Omne JavaScript hic se executara pro tote le usatores a cata cargamento de pagina. */",
- "monobook.js": "/* Omne JavaScript hic se executara pro le usatores del apparentia MonoBook */",
- "vector.js": "/* Omne JavaScript hic se executara pro le usatores del apparentia Vector */",
"anonymous": "{{PLURAL:$1|Usator|Usatores}} anonyme de {{SITENAME}}",
"siteuser": "Usator $1 de {{SITENAME}}",
"anonuser": "le usator anonyme $1 de {{SITENAME}}",
"pageinfo-category-pages": "Numero de paginas",
"pageinfo-category-subcats": "Numero de subcategorias",
"pageinfo-category-files": "Numero de files",
- "skinname-monobook": "MonoBook",
"markaspatrolleddiff": "Marcar como patruliate",
"markaspatrolledtext": "Marcar iste pagina como patruliate",
"markedaspatrolled": "Marcate como patruliate",
"qbmyoptions": "Halaman saya",
"faq": "FAQ",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Bagian baru",
- "vector-action-delete": "Hapus",
- "vector-action-move": "Pindahkan",
- "vector-action-protect": "Lindungi",
- "vector-action-undelete": "Pembatalan penghapusan",
- "vector-action-unprotect": "Ubah perlindungan",
- "vector-view-create": "Buat",
- "vector-view-edit": "Sunting",
- "vector-view-history": "Versi terdahulu",
- "vector-view-view": "Baca",
- "vector-view-viewsource": "Lihat sumber",
"actions": "Tindakan",
- "vector-more-actions": "Lainnya",
"namespaces": "Ruang nama",
"variants": "Varian",
"navigation-heading": "Menu navigasi",
"eauthentsent": "Sebuah surel untuk konfirmasi telah dikirim ke alamat surel. Sebelum surel lainnya dikirim ke akun tersebut, Anda harus mengikuti instruksi di dalam surel tersebut, untuk melakukan konfirmasi bahwa alamat tersebut adalah benar kepunyaan Anda.",
"throttled-mailpassword": "Suatu pengingat kata sandi telah dikirimkan dalam {{PLURAL:$1|$1 jam}} terakhir.\nUntuk menghindari penyalahgunaan, hanya satu kata sandi yang akan dikirimkan setiap {{PLURAL:$1|$1 jam}}.",
"mailerror": "Kesalahan dalam mengirimkan surel: $1",
- "acct_creation_throttle_hit": "Pengunjung wiki ini dengan alamat IP yang sama dengan Anda telah membuat {{PLURAL:$1|1 akun|$1 akun}} dalam satu hari terakhir, hingga jumlah maksimum yang diijinkan.\nKarenanya, pengunjung dengan alamat IP ini tidak dapat lagi membuat akun lain untuk sementara.",
+ "acct_creation_throttle_hit": "Pengunjung wiki ini dengan alamat IP yang sama dengan Anda telah membuat {{PLURAL:$1|1 akun|$1 akun}} dalam satu hari terakhir, hingga jumlah maksimum yang diizinkan.\nKarenanya, pengunjung dengan alamat IP ini tidak dapat lagi membuat akun lain untuk sementara.",
"emailauthenticated": "Alamat surel Anda telah dikonfirmasi pada $3, $2.",
"emailnotauthenticated": "Alamat surel Anda belum dikonfirmasi.\nSebelum dikonfirmasi Anda tidak akan menerima surel dari fitur berikut.",
"noemailprefs": "Anda harus memasukkan alamat surel di preferensi Anda untuk dapat menggunakan fitur-fitur ini.",
"difference-missing-revision": "{{PLURAL:$2|Satu revisi|$2 revisi}} dari perbedaan ini ($1) {{PLURAL:$2|tidak|tidak}} ditemukan.\n\nHal ini biasanya disebabkan oleh tautan diff yang kedaluwarsa ke halaman yang sudah dihapus.\nRinciannya dapat ditemukan di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].",
"searchresults": "Hasil pencarian",
"searchresults-title": "Hasil pencarian untuk \"$1\"",
- "toomanymatches": "Pencarian menghasilkan terlalu banyak hasil, silakan masukkan kueri lain",
"titlematches": "Judul halaman yang sama",
"textmatches": "Teks halaman yang cocok",
"notextmatches": "Tidak ada teks halaman yang cocok",
"filetype-mime-mismatch": "Ekstensi berkas \".$1\" tidak cocok dengan jenis MIME yang terdeteksi dari berkas ($2).",
"filetype-badmime": "Berkas dengan tipe MIME \"$1\" tidak diperkenankan untuk dimuat.",
"filetype-bad-ie-mime": "Tidak dapat memuat berkas ini karena Internet Explorer mendeteksinya sebagai \"$1\", yang tak diizinkan dan merupakan tipe berkas yang memiliki potensi bahaya.",
- "filetype-unwanted-type": "'''\".$1\"''' termasuk jenis berkas yang tidak diijinkan.\n{{PLURAL:$3|Jenis berkas yang disarankan adalah|Jenis berkas yang disarankan adalah}} $2.",
+ "filetype-unwanted-type": "'''\".$1\"''' termasuk jenis berkas yang tidak diizinkan.\n{{PLURAL:$3|Jenis berkas yang disarankan adalah|Jenis berkas yang disarankan adalah}} $2.",
"filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|adalah ekstensi berkas yang tidak diizinkan|adalah ekstensi berkas yang tidak diizinkan}}.\n{{PLURAL:$3|Jenis berkas yang diperolehkan adalah|Jenis berkas yang diperolehkan adalah}} $2.",
"filetype-missing": "Berkas tak memiliki ekstensi (misalnya \".jpg\").",
"empty-file": "Berkas yang Anda kirim kosong.",
"tooltip-preferences-save": "Simpan preferensi",
"tooltip-summary": "Masukkan sebuah ringkasan pendek",
"common.css": "/* CSS yang ada di sini akan diterapkan pada semua kulit. */",
- "monobook.css": "/* CSS yang ada di sini akan diterapkan pada kulit Monobook. */",
- "vector.css": "/* CSS nan ado di siko diterapkan pado kulik Vektor. */",
"print.css": "/* CSS yang ada di sini akan diterapkan pada tampilan cetak. */",
"noscript.css": "/* CSS di sini akan mempengaruhi pengguna dengan skrip Java non-aktif */",
"group-autoconfirmed.css": "/* CSS di sini hanya mempengaruhi pengguna terkonfirmasi otomatis */",
"group-sysop.css": "/* CSS di sini hanya mempengaruhi pengurus */",
"group-bureaucrat.css": "/* CSS di sini hanya mempengaruhi birokrat */",
"common.js": "/* JavaScript yang ada di sini akan diterapkan untuk semua kulit. */",
- "monobook.js": "/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit MonoBook */",
- "vector.js": "/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Vector */",
"group-autoconfirmed.js": "/* Semua JavaScript di sini hanya dimuatkan untuk pengguna terkonfirmasi otomatis */",
"group-bot.js": "/* Semua JavaScript di sini hanya dimuatkan untuk bot */",
"group-sysop.js": "/* Semua JavaScript di sini hanya dimuatkan untuk pengurus */",
"pageinfo-category-pages": "Jumlah halaman",
"pageinfo-category-subcats": "Jumlah subkategori",
"pageinfo-category-files": "Jumlah berkas",
- "skinname-monobook": "MonoBook",
- "skinname-vector": "Vektor",
"markaspatrolleddiff": "Tandai telah dipatroli",
"markaspatrolledtext": "Tandai halaman ini telah dipatroli",
"markedaspatrolled": "Ditandai telah dipatroli",
"qbmyoptions": "Pampanidko",
"faq": "MAS",
"faqpage": "Project:MAS",
- "vector-action-addsection": "Agnayon ti topiko",
- "vector-action-delete": "Ikkaten",
- "vector-action-move": "Iyalis",
- "vector-action-protect": "Salakniban",
- "vector-action-undelete": "Isubli ti inikkat",
- "vector-action-unprotect": "Sukatan ti salaknib",
- "vector-view-create": "Agaramid",
- "vector-view-edit": "Urnosen",
- "vector-view-history": "Kitaen ti pakasaritaan",
- "vector-view-view": "Basaen",
- "vector-view-viewsource": "Kitaen ti taudan",
"actions": "Dagiti aramid",
- "vector-more-actions": "Adu pay",
"namespaces": "Dagiti nagan ti espasio",
"variants": "Sab-sabali a pagsasao",
"navigation-heading": "Pagdaliasatan ti pagpilian",
"difference-missing-revision": "{{PLURAL:$2|Maysa a panagbalbaliw|$2 kadagiti panagbalbaliw}} iti daytoy a paggiddiatan ($1) {{PLURAL:$2|ket ti|ket dagiti}} saan a naburikan.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a nabaak a panilpo tipaggiddiatan ti maysa a panid a naikkaten.\nDagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
"searchresults": "Dagiti nagbanagan ti panagbiruk",
"searchresults-title": "Dagiti nabirukan a nagbanagan para iti \"$1\"",
- "toomanymatches": "Adu unay ti napasubli nga agpapada, pangngaasi a padasem ti sabali a panagsapul",
"titlematches": "Dagiti kapadpada a titulo ti panid",
"textmatches": "Dagiti agpapada a testo ti panid",
"notextmatches": "Awan dagiti kapadpada a testo ti panid",
"qbmyoptions": "Mínar síður",
"faq": "Algengar spurningar",
"faqpage": "Project:Algengar spurningar",
- "vector-action-addsection": "Bæta við umræðu",
- "vector-action-delete": "Eyða",
- "vector-action-move": "Færa",
- "vector-action-protect": "Vernda",
- "vector-action-undelete": "Hætta við eyðingu",
- "vector-action-unprotect": "Breyta verndunarstigi",
- "vector-view-create": "Skapa",
- "vector-view-edit": "Breyta",
- "vector-view-history": "Breytingaskrá",
- "vector-view-view": "Lesa",
- "vector-view-viewsource": "Sýna frumkóða",
"actions": "Aðgerðir",
"namespaces": "Nafnrými",
"variants": "Útgáfur",
"difference-missing-revision": "$2 {{PLURAL:$2|útgáfa|útgáfur}} samanburðarins ($1) {{PLURAL:$2|fannst|fundust}} ekki.\n\nÞetta gerist oftast þegar úreldur samanburðartengill tengir á síðu sem hefur verið eytt.\nFrekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} eyðingarskránni].",
"searchresults": "Leitarniðurstöður",
"searchresults-title": "Leitarniðurstöður fyrir „$1“",
- "toomanymatches": "Of mörgum niðurstöðum var skilað, gjörðu svo vel og reyndu aðra fyrirspurn",
"titlematches": "Titlar greina sem pössuðu við fyrirspurnina",
"textmatches": "Leitarorð fannst/fundust í innihaldi eftirfarandi greina",
"notextmatches": "Engar samsvaranir á texta í síðum",
"tooltip-preferences-save": "Vista stillingar",
"tooltip-summary": "Bættu við stuttu ágripi",
"common.css": "/* Allt CSS sem sett er hér mun virka á öllum þemum. */",
- "monobook.css": "/* Það sem sett er hingað er bætt við Monobook stilsniðið fyrir allan vefinn */",
"common.js": "/* Allt JavaScript sem sett er hér mun virka í hvert skipti sem að síða hleðst. */",
"anonymous": "$1 {{PLURAL:$1|óþekktur notandi|óþekktir notendur}} á {{SITENAME}}",
"siteuser": "{{SITENAME}} notandi $1",
"pageinfo-category-pages": "Fjöldi síðna",
"pageinfo-category-subcats": "Fjöldi undirflokka",
"pageinfo-category-files": "Fjöldi skráa",
- "skinname-monobook": "EinBók",
"markaspatrolleddiff": "Merkja sem yfirfarið",
"markaspatrolledtext": "Merkja þessa síðu sem yfirfarna",
"markedaspatrolled": "Merkja sem yfirfarið",
"qbmyoptions": "Le mie pagine",
"faq": "Domande frequenti",
"faqpage": "Project:Domande frequenti",
- "vector-action-addsection": "Aggiungi discussione",
- "vector-action-delete": "Cancella",
- "vector-action-move": "Sposta",
- "vector-action-protect": "Proteggi",
- "vector-action-undelete": "Ripristina",
- "vector-action-unprotect": "Cambia la protezione",
- "vector-view-create": "Crea",
- "vector-view-edit": "Modifica",
- "vector-view-history": "Cronologia",
- "vector-view-view": "Leggi",
- "vector-view-viewsource": "Visualizza sorgente",
"actions": "Azioni",
- "vector-more-actions": "Altro",
"namespaces": "Namespace",
"variants": "Varianti",
"navigation-heading": "Menu di navigazione",
"mergehistory-empty": "Nessuna versione da unire.",
"mergehistory-success": "{{PLURAL:$3|Una versione di [[:$1]] è stata unita|$3 versioni di [[:$1]] sono state unite}} alla cronologia di [[:$2]].",
"mergehistory-fail": "Impossibile unire le cronologie. Verificare la pagina e i parametri temporali.",
+ "mergehistory-fail-toobig": "Impossibile eseguire l'unione della cronologia con oltre $1 {{PLURAL:$1|revisione|revisioni}} da spostare.",
"mergehistory-no-source": "La pagina di origine $1 non esiste.",
"mergehistory-no-destination": "La pagina di destinazione $1 non esiste.",
"mergehistory-invalid-source": "La pagina di origine deve avere un titolo corretto.",
"difference-missing-revision": "{{PLURAL:$2|Una versione|$2 versioni}} di questa differenza ($1) {{PLURAL:$2|non è stata trovata|non sono state trovate}}.\n\nQuesto si verifica solitamente seguendo un collegamento obsoleto di un diff a una pagina cancellata.\nI dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro delle cancellazioni].",
"searchresults": "Risultati della ricerca",
"searchresults-title": "Risultati della ricerca di \"$1\"",
- "toomanymatches": "Troppe corrispondenze. Modificare la richiesta.",
"titlematches": "Corrispondenze nel titolo delle pagine",
"textmatches": "Corrispondenze nel testo delle pagine",
"notextmatches": "Nessuna corrispondenza nel testo delle pagine",
"windows-nonascii-filename": "Questo wiki non supporta nomi di file con caratteri speciali.",
"fileexists": "Un file con questo nome esiste già.\nVerificare prima <strong>[[:$1]]</strong> se non si è sicuri di volerlo sovrascrivere.\n[[$1|thumb]]",
"filepageexists": "La pagina di descrizione di questo file è già stata creata all'indirizzo <strong>[[:$1]]</strong>, anche se non esiste ancora un file con questo nome. La descrizione dell'oggetto inserita in fase di caricamento non apparirà sulla pagina di descrizione. Per far sì che l'oggetto compaia sulla pagina di descrizione, sarà necessario modificarla manualmente.\n[[$1|thumb]]",
- "fileexists-extension": "Un file con nome simile a questo esiste già: [[$2|thumb]]\n* Nome del file caricato: <strong>[[:$1]]</strong>\n* Nome del file esistente: <strong>[[:$2]]</strong>\nScegliere un nome diverso.",
+ "fileexists-extension": "Un file con nome simile a questo esiste già: [[$2|thumb]]\n* Nome del file caricato: <strong>[[:$1]]</strong>\n* Nome del file esistente: <strong>[[:$2]]</strong>\nForse vuoi scegliere un nome più caratteristico?.",
"fileexists-thumbnail-yes": "Il file caricato sembra essere una miniatura ''(thumbnail)''. [[$1|thumb]]\nVerificare, per confronto, il file <strong>[[:$1]]</strong>.\nSe si tratta della stessa immagine, nelle dimensioni originali, non è necessario caricarne altre miniature.",
"file-thumbnail-no": "Il nome del file inizia con <strong>$1</strong>; sembra quindi essere una miniatura ''(thumbnail)''.\nSe si dispone dell'immagine nella risoluzione originale, si prega di caricarla. In caso contrario, si prega di cambiare il nome del file.",
"fileexists-forbidden": "Un file con questo nome esiste già e non può essere sovrascritto. Tornare indietro e modificare il nome con il quale caricare il file. [[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "Cancellazione e recupero di file temporaneamente disattivati durante la manutenzione.",
"filedelete-maintenance-title": "Impossibile eliminare il file",
"mimesearch": "Ricerca in base al tipo MIME",
- "mimesearch-summary": "Questa pagina consente di filtrare i file in base al tipo MIME. Inserire la stringa di ricerca nella forma tipo/sottotipo, ad es. <code>image/jpeg</code>.",
+ "mimesearch-summary": "Questa pagina consente di filtrare i file in base al tipo MIME.\nInserire la stringa di ricerca nella forma tipo/sottotipo o tipo/*, ad es. <code>image/jpeg</code>.",
"mimetype": "Tipo MIME:",
"download": "scarica",
"unwatchedpages": "Pagine non osservate",
"tooltip-summary": "Inserire una breve sintesi",
"interlanguage-link-title": "$1 - $2",
"common.css": "/* Gli stili CSS inseriti qui si applicano a tutte le skin */",
- "monobook.css": "/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Monobook */",
- "vector.css": "/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Vector */",
"print.css": "/* Gli stili CSS inseriti qui si applicano all'output in stampa */",
"noscript.css": "/ * Gli stili CSS inseriti qui si applicano agli utenti che hanno JavaScript disabilitato * /",
"group-autoconfirmed.css": "/ * Gli stili CSS inseriti qui si applicheranno solo ad utenti autoconvalidati * /",
"group-sysop.css": "/ * Gli stili CSS inseriti qui si applicheranno solo agli amministratori/sysop * /",
"group-bureaucrat.css": "/ * Gli stili CSS inseriti qui si applicheranno solo ai burocrati * /",
"common.js": "/* Il codice JavaScript inserito qui viene caricato da ciascuna pagina, per tutti gli utenti. */",
- "monobook.js": "/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin MonoBook */",
- "vector.js": "/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Vector */",
"group-autoconfirmed.js": "/ * Il codice JavaScript inserito qui viene caricato solo per gli utenti autoconvalidati * /",
"group-user.js": "/ * Il codice JavaScript inserito qui viene caricato solo per gli utenti registrati * /",
"group-bot.js": "/ * Il codice JavaScript inserito qui viene caricato solo per i bot * /",
"version-hook-name": "Nome dell'hook",
"version-hook-subscribedby": "Sottoscrizioni",
"version-version": "($1)",
+ "version-no-ext-name": "[senza nome]",
"version-license": "Licenza MediaWiki",
"version-ext-license": "Licenza",
"version-ext-colheader-name": "Estensione",
"蝋燭α",
"青子守歌",
"아라",
- "Rxy"
+ "Rxy",
+ "Mfuji"
]
},
"tog-underline": "リンクの下線:",
"qbmyoptions": "自分のページ",
"faq": "よくある質問と回答",
"faqpage": "Project:よくある質問と回答",
- "vector-action-addsection": "話題追加",
- "vector-action-delete": "削除",
- "vector-action-move": "移動",
- "vector-action-protect": "保護",
- "vector-action-undelete": "復元",
- "vector-action-unprotect": "保護再設定",
- "vector-view-create": "作成",
- "vector-view-edit": "編集",
- "vector-view-history": "履歴表示",
- "vector-view-view": "閲覧",
- "vector-view-viewsource": "ソースを閲覧",
"actions": "操作",
- "vector-more-actions": "その他",
"namespaces": "名前空間",
"variants": "変種",
"navigation-heading": "案内メニュー",
"mergehistory-empty": "統合できる版がありません。",
"mergehistory-success": "[[:$1]]の $3 {{PLURAL:$3|版}}を[[:$2]]に統合しました。",
"mergehistory-fail": "履歴の統合を実行できません。ページと時刻の引数を再確認してください。",
+ "mergehistory-fail-toobig": "移動させた{{PLURAL:$1|版}}の数が上限を超えているため、履歴の統合を実行できません。",
"mergehistory-no-source": "統合元ページ $1 が存在しません。",
"mergehistory-no-destination": "統合先ページ $1 が存在しません。",
"mergehistory-invalid-source": "統合元のページは有効な名前でなければなりません。",
"difference-missing-revision": "指定された{{PLURAL:$2|$2版}}の差分 ($1) が見つかりませんでした。\n\n通常、削除されたページの版への古い差分表示や固定リンクをたどった際に、このようなことが起きます。 \n詳細は[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]を参照してください。",
"searchresults": "検索結果",
"searchresults-title": "「$1」の検索結果",
- "toomanymatches": "一致したページが多すぎます。他の検索語を指定してください。",
"titlematches": "ページ名と一致",
"textmatches": "ページ本文と一致",
"notextmatches": "どのページ本文とも一致しませんでした",
"largefileserver": "このファイルは、サーバー設定で許されている最大サイズより大きいです。",
"emptyfile": "アップロードしたファイルは内容が空のようです。\nファイル名の指定が間違っている可能性があります。\n本当にこのファイルをアップロードしたいのか、確認してください。",
"windows-nonascii-filename": "このウィキではファイル名に特殊文字を使用できません。",
- "fileexists": "この名前のファイルは既に存在します。置き換えていいかどうか確信が持てない場合は、<strong>[[:$1]]</strong>を確認してください。\n[[$1|thumb]]",
+ "fileexists": "この名前のファイルは既に存在します。{{GENDER:|}}置き換えていいかどうか確信が持てない場合は、<strong>[[:$1]]</strong>を確認してください。\n[[$1|thumb]]",
"filepageexists": "このファイルのための説明ページは既に<strong>[[:$1]]</strong>に作成されていますが、現在、ファイルが存在しません。\n入力した概要は説明ページに反映されません。\n新しい概要を表示させるには、説明ページを手動で編集する必要があります。\n[[$1|thumb]]",
"fileexists-extension": "類似した名前のファイルが既に存在します: [[$2|thumb]]\n* アップロード中のファイルの名前: <strong>[[:$1]]</strong>\n* 既存ファイルの名前: <strong>[[:$2]]</strong>\n違う名前を選択してください。",
"fileexists-thumbnail-yes": "このファイルは元の画像から縮小されたもの <em>(サムネイル)</em> のようです。\n[[$1|thumb]]\nファイル <strong>[[:$1]]</strong> を確認してください。\n確認したファイルが同じ画像の元のサイズの版の場合は、サムネイルを別途アップロードする必要はありません。",
"filedelete-maintenance": "メンテナンス中のため、ファイルの削除と復元は一時的に無効化されています。",
"filedelete-maintenance-title": "ファイルを削除できません",
"mimesearch": "MIMEタイプ検索",
- "mimesearch-summary": "このページでは、ファイルをMIMEタイプで絞り込みます。\ncontenttype/subtypeの形式で入力してください (例: <code>image/jpeg</code>)。",
+ "mimesearch-summary": "このページでは、ファイルをMIMEタイプで絞り込みます。\ncontenttype/subtype または contenttype/* の形式で入力してください (例: <code>image/jpeg</code>)。",
"mimetype": "MIMEタイプ:",
"download": "ダウンロード",
"unwatchedpages": "ウォッチされていないページ",
"allarticles": "全ページ",
"allinnamespace": "全ページ ($1名前空間)",
"allpagessubmit": "表示",
- "allpagesprefix": "次の文字列から始まるページを表示:",
+ "allpagesprefix": "表示するページ名の先頭:",
"allpagesbadtitle": "指定したページ名は無効か、言語間またはインターウィキ接頭辞を含んでいます。\nページ名に使用できない文字が1つ以上含まれている可能性があります。",
"allpages-bad-ns": "{{SITENAME}}に「$1」という名前空間はありません。",
"allpages-hide-redirects": "リダイレクトを隠す",
"tooltip-summary": "短い要約を入力してください",
"interlanguage-link-title": "$2: $1",
"common.css": "/* ここに記述したCSSはすべての外装に反映されます */",
- "monobook.css": "/* ここに記述したCSSはモノブック外装の利用者に影響します */",
- "vector.css": "/* ここに記述したCSSはベクター外装の利用者に影響します */",
"print.css": "/* ここに記述したCSSは印刷出力に影響します */",
"noscript.css": "/* ここに記述したCSSはJavaScriptを無効にしている利用者に影響します */",
"group-autoconfirmed.css": "/* ここに記述したCSSは自動承認された利用者のみに影響します */",
"group-sysop.css": "/* ここに記述したCSSは管理者のみに影響します */",
"group-bureaucrat.css": "/* ここに記述したCSSはビューロクラットのみに影響します */",
"common.js": "/* ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます */",
- "monobook.js": "/* ここにあるすべてのJavaScriptは、モノブック外装を使用している利用者に対して読み込まれます */",
- "vector.js": "/* ここにあるすべてのJavaScriptは、ベクター外装を使用している利用者に対して読み込まれます */",
"group-autoconfirmed.js": "/* ここにあるすべてのJavaScriptは、自動承認された利用者のみに読み込まれます */",
"group-user.js": "/* ここにあるすべてのJavaScriptは、登録利用者のみに読み込まれます */",
"group-bot.js": "/* ここにあるすべてのJavaScriptは、ボットのみに読み込まれます */",
"pageinfo-category-pages": "ページ数",
"pageinfo-category-subcats": "下位カテゴリ数",
"pageinfo-category-files": "ファイル数",
- "skinname-monobook": "モノブック",
- "skinname-vector": "ベクター",
"markaspatrolleddiff": "巡回済みにする",
"markaspatrolledtext": "このページを巡回済みにする",
"markedaspatrolled": "巡回済みにしました",
"watchlistedit-clear-removed": "{{PLURAL:$1|$1 件のページ}}を除去しました:",
"watchlistedit-too-many": "ページ数が多すぎるため表示できません。",
"watchlisttools-clear": "ウォッチリストの全消去",
- "watchlisttools-view": "関連する変更を閲覧",
- "watchlisttools-edit": "ウォッチリストの閲覧と編集",
+ "watchlisttools-view": "関連する変更を表示",
+ "watchlisttools-edit": "ウォッチリストの表示と編集",
"watchlisttools-raw": "ウォッチリストをテキストで編集",
"iranian-calendar-m1": "ファルヴァルディーン",
"iranian-calendar-m2": "オルディーベヘシュト",
"version-hook-name": "フック名",
"version-hook-subscribedby": "使用個所",
"version-version": "(バージョン $1)",
+ "version-no-ext-name": "[名前なし]",
"version-license": "MediaWiki のライセンス",
"version-ext-license": "ライセンス",
"version-ext-colheader-name": "拡張機能",
"qbmyoptions": "Opsiku",
"faq": "FAQ (Pitakonan sing kerep diajokaké)",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Tambah topik",
- "vector-action-delete": "Busak",
- "vector-action-move": "Pindhahna",
- "vector-action-protect": "Reksa",
- "vector-action-undelete": "Batalna pambusakan",
- "vector-action-unprotect": "Owahi pangreksan",
- "vector-view-create": "Gawé",
- "vector-view-edit": "Sunting",
- "vector-view-history": "Sajarah kaca",
- "vector-view-view": "Waca",
- "vector-view-viewsource": "Pirsani sumber",
"actions": "Tindakan",
"namespaces": "Ruang jeneng",
"variants": "Varian",
"difference-missing-revision": "{{PLURAL:$2|Sak pambenahan|$2 pambenahan}} saka prabédan iki ($1) {{PLURAL:$2|ora ditemokaké|ora ditemokaké}}.\n\nIki biasané kasebab pranala prabedan sing wis ora kanggo saka kaca isi wis dibusak.\nRinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busak].",
"searchresults": "Kasil panggolèkan",
"searchresults-title": "Kasil panggolèkan saka \"$1\"",
- "toomanymatches": "Olèhé panjenengan golèk ngasilaké kakèhan pituwas, mangga nglebokaké ''query'' liyané",
"titlematches": "Irah-irahan artikel sing cocog",
"textmatches": "Tèks artikel sing cocog",
"notextmatches": "Ora ana tèks kaca sing cocog",
"qbmyoptions": "ჩემი გვერდები",
"faq": "ხშირი შეკითხვები",
"faqpage": "Project:ხშირი შეკითხვები",
- "vector-action-addsection": "თემის ჩამატება",
- "vector-action-delete": "წაშლა",
- "vector-action-move": "გადატანა",
- "vector-action-protect": "დაცვა",
- "vector-action-undelete": "აღდგენა",
- "vector-action-unprotect": "დაცვის შეცვლა",
- "vector-view-create": "შექმნა",
- "vector-view-edit": "რედაქტირება",
- "vector-view-history": "ისტორია",
- "vector-view-view": "შემოწმებული სტატია",
- "vector-view-viewsource": "წყაროს ხილვა",
"actions": "მოქმედებები",
- "vector-more-actions": "მეტი",
"namespaces": "სახელთა სივრცე",
"variants": "ვარიანტები",
"navigation-heading": "სანავიგაციო მენიუ",
"difference-missing-revision": "{{PLURAL:$2|$2 ვერსია}} ამ შედარებისათვის ($1) {{PLURAL:$2|ვერ მოიძებნა}}.\n\nეს ჩვეულებრივ ხდება მაშინ, თუ ვერსიების შედარების მოძველებული ბმულით გადადიხართ გვერდზე, რომელიც წაიშალა.\nდეტალური ინფორმაცია შესაძლებელია იყოს [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} წაშლების ჟურნალში].",
"searchresults": "ძიების შედეგები",
"searchresults-title": "ძიების შედეგები „$1“",
- "toomanymatches": "ნაპოვნია ძალიან ბევრი შესაბამისობა, ეცადეთ სხვა მოთხოვნა",
"titlematches": "სტატიის სათაური შეესაბამება",
"textmatches": "გვერდის ტექსტი შესაბამისია",
"notextmatches": "არ შეესაბამება არცერთი გვერდის ტექსტი",
"tooltip-summary": "შეიყვანეთ მოკლე სქოლიო",
"interlanguage-link-title": "$1 — $2",
"common.css": "/** აქ ჩასმული CSS გამოყენებული იქნება გაფორმების ყველა გარეკანზე */",
- "monobook.css": "/* აქ ჩასმული CSS გავლენას იქონიებს Monobook ინტერფეისის მომხმარებლებზე */",
- "vector.css": "/* აქ ჩასმული CSS გამოყენებული იქნება ვექტორული გაფორმების თემაში */",
"group-autoconfirmed.css": "/* აქ განთავსებული CSS გამოყენებული იქნება მხოლოდ ავტომატურად დადასტურებული მომხმარებლებისათვის */",
"group-bot.css": "/* აქ განთავსებული CSS გამოყენებული იქნება მხოლოდ ბოტებისათვის */",
"group-sysop.css": "/* აქ განთავსებული CSS გამოყენებული იქნება მხოლოდ ადმინისტრატორებისათვის */",
"pageinfo-category-pages": "გვერდების რაოდენობა",
"pageinfo-category-subcats": "ქვეკატეგორიების რაოდენობა",
"pageinfo-category-files": "ფაილების რაოდენობა",
- "skinname-monobook": "მონობუკი",
- "skinname-vector": "ვექტორული",
"markaspatrolleddiff": "მონიშნე როგორც პატრულირებული",
"markaspatrolledtext": "მონიშნე ეს სტატია როგორც პატრულირებული",
"markedaspatrolled": "მონიშნულია როგორც პატრულირებული",
"qbmyoptions": "isebtar inu",
"faq": "Isteqsiyen",
"faqpage": "Project:Isteqsiyen",
- "vector-action-addsection": "Rnud ameggay",
- "vector-action-delete": "Mḥu",
- "vector-action-move": "Smimeḍ",
- "vector-action-protect": "Mmesten",
- "vector-action-undelete": "Uɣaled",
- "vector-action-unprotect": "Beddel amesten",
- "vector-view-create": "Snulfu",
- "vector-view-edit": "Ẓẓiẓreg",
- "vector-view-history": "Ẓeṛ amazray",
- "vector-view-view": "Ɣer",
- "vector-view-viewsource": "Ẓer aɣbalu",
"actions": "Tigawtin",
"namespaces": "Talluntin n isemawen",
"variants": "Tineḍwa",
"difference-missing-revision": "{{PLURAL:$1|Yiwet tacaggart|$1 ticaggartin}} n tameẓla agi ($1) {{PLURAL:$2|ur tella ara (ulac)|ur llant ara (ulac)}}.\n\nAcku azday n tameẓla, ɣef wayen tsennedeḍ, d-aqbur. Asebter yemḥa.\nTzemreḍ ad affeḍ tilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} uɣmis n isebtar yekksen].",
"searchresults": "Igmad n unadi",
"searchresults-title": "Igmad n unadi i \"$1\"",
- "toomanymatches": "Teceggeɛeḍ amḍan ameqqṛan n igemmaḍ, ilaq ad ceggeɛeḍ tuttra nniḍen.",
"titlematches": "Ayen yecban azwel n umegrad",
"textmatches": "Ayen yecban azwel n usebter",
"notextmatches": "ulac ayen yecban azwel n usebter",
"qbmyoptions": "Беттерім",
"faq": "Жиі қойылатын сұрақтар",
"faqpage": "Project:Жиі қойылатын сұрақтар",
- "vector-action-addsection": "Тақырып қосу",
- "vector-action-delete": "Жою",
- "vector-action-move": "Жылжыту",
- "vector-action-protect": "Қорғау",
- "vector-action-undelete": "Жоймау",
- "vector-action-unprotect": "Қорғанысты өзгерту",
- "vector-view-create": "Бастау",
- "vector-view-edit": "Өңдеу",
- "vector-view-history": "Өңделу тарихы",
- "vector-view-view": "Оқу",
- "vector-view-viewsource": "Қайнарын қарау",
"actions": "Әрекеттер",
- "vector-more-actions": "Тағы",
"namespaces": "Есім кеңістіктері",
"variants": "Нұсқалар",
"navigation-heading": "Бағыттау мәзірі",
"difference-missing-revision": "Бұл ($1) {{PLURAL:$2|нұсқа|$2 нұсқалар}} айырмашылығы табылмады.\n\n\nБұл әлте жойылған беттің нұсқалар айырмашылығының сілтемесі.\nЕгжей-тегжейін [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналынан] таба аласыз.",
"searchresults": "Іздеу нәтижелері",
"searchresults-title": "\"$1\" сұранымына табылған нәтижелер",
- "toomanymatches": "Тым көп сәйкес қайтарылды, өзге сұранымды байқап көріңіз",
"titlematches": "Бет атауы сәйкес келеді",
"textmatches": "Бет мәтіні сәйкес келеді",
"notextmatches": "Еш бет мәтіні сәйкес емес",
"tooltip-ca-unprotect": "Бұл беттің қорғалуын өзгерту",
"tooltip-ca-delete": "Бұл бетті жою",
"tooltip-ca-undelete": "Бұл беттің жоюдың алдындағы болған өңдемелерін қалпына келтіру",
- "tooltip-ca-move": "Бұл бетті жылжыту",
+ "tooltip-ca-move": "Бұл беттің атауын өзгерту",
"tooltip-ca-watch": "Бұл бетті бақылау тізіміңізге үстеу",
"tooltip-ca-unwatch": "Бұл бетті бақылау тізіміңізден аластау",
"tooltip-search": "{{SITENAME}} жобасында іздеу",
"tooltip-rollback": "\"Шегіндіру\" сілтемесін бір рет басу арқылы соңға редактордың барлық қатар өңдемелерін өшіру",
"tooltip-preferences-save": "Бапталымдарыңызды сақтау",
"tooltip-summary": "Қысқаша түйіндемесін енгізіңіз",
+ "interlanguage-link-title-nonlang": "$1 – $2",
"common.css": "/* Мында орналастырылған CSS барлық мәнерлерде қолданылады */",
- "monobook.css": "/* Мында орналастырылған CSS тек «Дара кітап» (monobook) мәнерін пайдаланушыларына ықпал етеді */",
"common.js": "/* Мындағы әртүрлі JavaScript кез келген бет қотарылғанда барлық пайдаланушылар үшін жегіледі. */",
- "monobook.js": "/* Мындағы JavaScript тек «Дара кітап» (monobook) мәнерін пайдаланушылар үшін жегіледі */",
"anonymous": "{{SITENAME}} тіркелгісіз {{PLURAL:$1|қатысушысы|қатысушылары}}",
"siteuser": "{{SITENAME}} қатысушы $1",
"anonuser": "{{SITENAME}} анонимді қатысушы: $1",
"pageinfo-category-pages": "Беттер саны",
"pageinfo-category-subcats": "Санатшалар саны",
"pageinfo-category-files": "Файлдар саны",
- "skinname-monobook": "Жеке кітап (monobook)",
"markaspatrolleddiff": "Зерттелді деп белгілеу",
"markaspatrolledtext": "Бұл бетті тексерілді деп белгілеу",
"markedaspatrolled": "Тексерілді деп белгіленді",
"qbmyoptions": "ទំព័ររបស់ខ្ញុំ",
"faq": "សំណួរដែលសួរញឹកញាប់",
"faqpage": "Project:សំណួរដែលសួរញឹកញាប់",
- "vector-action-addsection": "បន្ថែមប្រធានបទ",
- "vector-action-delete": "លុបចោល",
- "vector-action-move": "ប្តូរទីតាំង",
- "vector-action-protect": "ការពារ",
- "vector-action-undelete": "ឈប់លុបចោល",
- "vector-action-unprotect": "ប្ដូរការការពារ",
- "vector-view-create": "បង្កើត",
- "vector-view-edit": "កែប្រែ",
- "vector-view-history": "មើលប្រវត្តិ",
- "vector-view-view": "អាន",
- "vector-view-viewsource": "មើលកូដ",
"actions": "សកម្មភាព",
"namespaces": "លំហឈ្មោះ",
"variants": "សណ្ដាន",
"difference-missing-revision": " {{PLURAL:$2|រកមិនឃើញ|រកមិនឃើញ}}{{PLURAL:$2|កំណែមួយ|កំណែចំនួន $2}} របស់ភាពខុសគ្នានេះ ($1) ទេ។\n\nជាធម្មតានេះបណ្ដាលមកពីការតាមទៅកាន់តំនភ្ជាប់ភាពខុសគ្នារបស់ទំព័រដែលត្រូវបានលុបចោល។\nព័ត៌មានលំអិតអាចរកបាននៅក្នុង [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} កំណត់ហេតុនៃការលុបចោល]។",
"searchresults": "លទ្ធផលស្វែងរក",
"searchresults-title": "លទ្ធផលស្វែងរកសម្រាប់ \"$1\"",
- "toomanymatches": "មានតំណភ្ជាប់ច្រើនណាស់ត្រូវបានបង្ហាញ ចូរព្យាយាមប្រើសំណួរផ្សេងមួយទៀត",
"titlematches": "ភាពត្រូវគ្នានៃចំណងជើងទំព័រ",
"textmatches": "ទំព័រអត្ថបទផ្គូរផ្គងគ្នា",
"notextmatches": "គ្មានអត្ថបទទំព័រណាមួយដែលមានខ្លឹមសារផ្គូផ្គងនឹងឃ្លាឬពាក្យនេះទេ",
"tooltip-preferences-save": "រក្សាទុកចំណង់ចំណូលចិត្ត",
"tooltip-summary": "សរសេរចំណារពន្យល់ថ្មីមួយ",
"common.css": "/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើគ្រប់សំបកទាំងអស់ */",
- "monobook.css": "/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Monobook */",
- "vector.css": "/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Vector */",
"anonymous": "{{PLURAL:$1|user|អ្នកប្រើប្រាស់}}អនាមិកនៃ {{SITENAME}}",
"siteuser": "អ្នកប្រើប្រាស់{{SITENAME}} $1",
"anonuser": "អ្នកប្រើប្រាស់{{SITENAME}}អនាមិក $1",
"pageinfo-category-pages": "ចំនួនទំព័រ",
"pageinfo-category-subcats": "ចំនួនកូនចំណាត់ថ្នាក់ក្រុម",
"pageinfo-category-files": "ចំនួនឯកសារ",
- "skinname-monobook": "សៀវភៅឯក",
- "skinname-vector": "វ៉ិចទ័រ",
"markaspatrolleddiff": "ចំណាំថាបានល្បាត",
"markaspatrolledtext": "ចំណាំទំព័រនេះថាបានល្បាត",
"markedaspatrolled": "បានចំណាំថាបានល្បាត",
"qbmyoptions": "내 사용자 문서",
"faq": "자주 묻는 질문",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "새 주제",
- "vector-action-delete": "삭제",
- "vector-action-move": "옮기기",
- "vector-action-protect": "보호",
- "vector-action-undelete": "삭제 취소",
- "vector-action-unprotect": "보호 설정 바꾸기",
- "vector-view-create": "만들기",
- "vector-view-edit": "편집",
- "vector-view-history": "역사 보기",
- "vector-view-view": "읽기",
- "vector-view-viewsource": "원본 보기",
"actions": "행위",
- "vector-more-actions": "더 보기",
"namespaces": "이름공간",
"variants": "변수",
"navigation-heading": "둘러보기 메뉴",
"mergehistory-empty": "합칠 수 있는 판이 없습니다.",
"mergehistory-success": "[[:$1]] 문서의 {{PLURAL:$3|판}} $3개가 [[:$2]]에 성공적으로 합쳐졌습니다.",
"mergehistory-fail": "역사 합치기를 수행할 수 없습니다, 문서와 시간 변수를 다시 확인하세요.",
+ "mergehistory-fail-toobig": "옮기려는 {{PLURAL:$1|판}} $1개 제한보다 많이 역사 병합을 수행할 수 없습니다.",
"mergehistory-no-source": "원본인 $1 문서가 존재하지 않습니다.",
"mergehistory-no-destination": "대상인 $1 문서가 존재하지 않습니다.",
"mergehistory-invalid-source": "원본 문서는 올바른 제목이어야 합니다.",
"difference-missing-revision": "문서 비교에서 {{PLURAL:$2|하나|$2개}}의 판($1)을 찾을 수 {{PLURAL:$2|없습니다}}.\n\n이 문제는 주로 삭제된 문서를 가리키는 오래된 문서 비교 링크로 인해 발생합니다.\n자세한 내용은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 확인할 수 있습니다.",
"searchresults": "검색 결과",
"searchresults-title": "\"$1\"에 대한 검색 결과",
- "toomanymatches": "일치하는 결과가 너무 많습니다. 다른 검색어를 입력해주세요.",
"titlematches": "문서 제목 일치",
"textmatches": "문서 내용 일치",
"notextmatches": "해당하는 문서 없음",
"right-purge": "확인 없이 문서의 캐시를 새로 고침",
"right-autoconfirmed": "IP 기반의 속도 제한에 영향을 받지 않음",
"right-bot": "봇의 편집으로 취급",
- "right-nominornewtalk": "토론 문서를 새로 만들때 사소한 편집 사용 불가능",
+ "right-nominornewtalk": "토론 문서에 사소한 편집으로 새 메시지를 보낼 수 없음",
"right-apihighlimits": "API 상한 상승",
"right-writeapi": "API 작성",
"right-delete": "문서 삭제",
"largefileserver": "이 파일의 크기가 서버에서 허용된 설정보다 큽니다.",
"emptyfile": "올리려는 파일이 빈 파일입니다.\n파일 이름을 잘못 입력했을 수도 있습니다.\n올리려는 파일을 다시 한 번 확인해 주시기 바랍니다.",
"windows-nonascii-filename": "이 위키에서는 특수 문자가 포함된 파일 이름을 지원하지 않습니다.",
- "fileexists": "같은 이름의 파일이 이미 있습니다. 파일을 바꾸고 싶지 않다면 <strong>[[:$1]]</strong> 파일을 확인해 주세요.\n[[$1|thumb]]",
+ "fileexists": "같은 이름의 파일이 이미 있습니다. {{GENDER:|}}파일을 바꾸고 싶지 않다면 <strong>[[:$1]]</strong> 파일을 확인해 주세요.\n[[$1|thumb]]",
"filepageexists": "이 파일의 설명 문서가 <strong>[[:$1]]</strong>에 존재하지만, 이 이름을 가진 파일이 존재하지 않습니다.\n입력한 설명은 설명 문서에 반영되지 않을 것입니다.\n설명을 반영시키려면, 직접 편집하셔야 합니다.\n[[$1|thumb]]",
- "fileexists-extension": "비슷한 이름의 파일이 존재합니다: [[$2|thumb]]\n* 올리려는 파일 이름: <strong>[[:$1]]</strong>\n* 존재하는 파일 이름: <strong>[[:$2]]</strong>\n다른 이름으로 선택하세요.",
+ "fileexists-extension": "비슷한 이름의 파일이 존재합니다: [[$2|thumb]]\n* 올리려는 파일 이름: <strong>[[:$1]]</strong>\n* 존재하는 파일 이름: <strong>[[:$2]]</strong>\n아마도 더 독특한 이름을 사용하고 싶으신가요?",
"fileexists-thumbnail-yes": "파일은 그림의 크기를 줄인 (섬네일) 파일인 것 같습니다.\n[[$1|thumb]]\n<strong>[[:$1]]</strong> 파일을 확인하세요.\n해당 파일이 현재 올리려는 파일과 같다면 더 작은 크기의 그림을 올릴 필요는 없습니다.",
"file-thumbnail-no": "파일 이름이 <strong>$1</strong>으로 시작합니다.\n이 파일은 그림의 크기를 줄인 (섬네일) 파일인 것 같습니다.\n더 해상도가 좋은 파일이 있다면 그 파일을 올리거나 아니면 올리려는 파일 이름을 바꾸세요.",
"fileexists-forbidden": "같은 이름의 파일이 이미 있고, 덮어쓸 수 없습니다.\n그래도 파일을 올리시려면, 뒤로 돌아가서 다른 이름으로 시도해 주시기 바랍니다.\n[[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "점검 중에는 임시적으로 삭제와 되살리기를 할 수 없습니다.",
"filedelete-maintenance-title": "파일을 삭제할 수 없습니다",
"mimesearch": "MIME 검색",
- "mimesearch-summary": "MIME 유형에 해당하는 파일을 검색합니다.\n다음 형태로 입력해주세요: 내용종류/하위종류, 예를 들어 <code>image/jpeg</code>",
+ "mimesearch-summary": "이 페이지는 MIME 유형에 해당하는 파일을 필터합니다.\n입력: 내용종류/하위종류나 내용종류/*, 예를 들어 <code>image/jpeg</code>",
"mimetype": "MIME 형식:",
"download": "다운로드",
"unwatchedpages": "주시되지 않는 문서 목록",
"wantedtemplates": "필요한 틀 목록",
"mostlinked": "가장 많이 연결된 문서 목록",
"mostlinkedcategories": "가장 많이 연결된 분류 목록",
- "mostlinkedtemplates": "가장 많이 사용된 틀 목록",
+ "mostlinkedtemplates": "가장 많이 끼워진 문서",
"mostcategories": "가장 많이 분류된 문서 목록",
"mostimages": "가장 많이 사용된 파일 목록",
"mostinterwikis": "가장 많이 인터위키가 달린 문서 목록",
"tooltip-summary": "짧은 요약을 적어주세요",
"interlanguage-link-title": "$1 – $2",
"common.css": "/* 이 CSS 설정은 모든 스킨에 동일하게 적용됩니다 */",
- "monobook.css": "/* 이 CSS 설정은 모노북 스킨을 사용하는 사용자에게 적용됩니다 */",
- "vector.css": "/* 이 CSS 설정은 벡터 스킨을 사용하는 사용자에게 적용됩니다 */",
"print.css": "/* 이 CSS 설정은 인쇄 출력 화면에 적용됩니다 */",
"noscript.css": "/* 이 CSS 설정은 자바스크립트를 비활성화한 사용자에 적용됩니다 */",
"group-autoconfirmed.css": "/* 이 CSS 설정은 자동 인증된 사용자에만 적용됩니다 */",
"group-sysop.css": "/* 이 CSS 설정은 관리자에만 적용됩니다 */",
"group-bureaucrat.css": "/* 이 CSS 설정은 사무관에만 적용됩니다 */",
"common.js": "/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */",
- "monobook.js": "/* 이 자바스크립트 설정은 모노북 스킨을 사용하는 사용자에게 적용됩니다 */",
- "vector.js": "/* 이 자바스크립트 설정은 벡터 스킨을 사용하는 사용자에게 적용됩니다 */",
"group-autoconfirmed.js": "/* 이 자바스크립트 설정은 자동 인증된 사용자에만 적용됩니다 */",
"group-bot.js": "/* 이 자바스크립트 설정은 봇에만 적용됩니다 */",
"group-sysop.js": "/* 이 자바스크립트 설정은 관리자에만 적용됩니다 */",
"pageinfo-category-pages": "문서 수",
"pageinfo-category-subcats": "하위 분류 수",
"pageinfo-category-files": "파일 수",
- "skinname-monobook": "모노북",
- "skinname-vector": "벡터",
"markaspatrolleddiff": "검토한 문서로 표시",
"markaspatrolledtext": "이 문서를 검토한 것으로 표시",
"markedaspatrolled": "검토한 문서로 표시",
"qbmyoptions": "Бетлерим",
"faq": "FAQ",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Джангы тема къош",
- "vector-action-delete": "Кетер",
- "vector-action-move": "Атын ауушдур",
- "vector-action-protect": "Джакъла",
- "vector-action-undelete": "Къайтар",
- "vector-action-unprotect": "Джакълауну тюрлендир",
- "vector-view-create": "Къура",
- "vector-view-edit": "Тюрлендир",
- "vector-view-history": "Тарихи",
- "vector-view-view": "Окъу",
- "vector-view-viewsource": "Кодха къара",
"actions": "Этиуле",
- "vector-more-actions": "Энтда",
"namespaces": "Атланы аламы",
"variants": "Вариантла",
"navigation-heading": "Навигация меню",
"titleprotectedwarning": "'''Эсгертиу: Бу бет джакъланыбды. Джангыз [[Special:ListGroupRights|энчи хакълары]] болгъанла текстни салыргъа боллукъдула.'''\nТюбюнде, билги ючюн журналдан ахыр джазыу берилгенди:",
"templatesused": "Бу бетде хайырланылгъан {{PLURAL:$1|шаблон|шаблонла}}:",
"templatesusedpreview": "Ал къаралыучу бетде хайырланнган {{PLURAL:$1|1=шаблон|шаблонла}}:",
- "templatesusedsection": "Бу бетде хайырланнган {{PLURAL:$1|1=шаблон|шаблонла}}:",
+ "templatesusedsection": "Бу бёлюмде хайырланылгъан {{PLURAL:$1|шаблон|шаблонла}}:",
"template-protected": "(джакъланнган)",
"template-semiprotected": "(джарты джакъланыбды)",
"hiddencategories": "Бу бет $1 {{PLURAL:$1|1 джашырылгъан категориягъа|$1 джашырылгъан категориягъа}} киреди:",
"nocreate-loggedin": "Джангы бетле къураргъа эркинлигигиз джокъду.",
"sectioneditnotsupported-title": "Бёлюмлени тюрлендирир мадар джокъду.",
"sectioneditnotsupported-text": "Бу бетде бёлюмлени тюрлендирирге болмайды.",
- "permissionserrors": "Эркинликлени халатлары",
- "permissionserrorstext": "Ð\91Ñ\8bлайдагÑ\8aÑ\8b {{PLURAL:$1|1=Ñ\87Ñ\83Ñ\80Ñ\83м|Ñ\87Ñ\83Ñ\80Ñ\83мла}} Ñ\8eÑ\87Ñ\8eн, бÑ\83нÑ\83 Ñ\8dÑ\82еÑ\80ге Ñ\85акÑ\8aÑ\8bгÑ\8aÑ\8bз джокÑ\8aдÑ\83:",
+ "permissionserrors": "Эркинликлени халаты",
+ "permissionserrorstext": "Ð\91Ñ\83 опеÑ\80аÑ\86иÑ\8fнÑ\8b Ñ\8dÑ\82еÑ\80ге Ñ\8dÑ\80кинлигигиз джокÑ\8aдÑ\83, бÑ\8bлайдагÑ\8aÑ\8b {{PLURAL:$1|1=Ñ\87Ñ\83Ñ\80Ñ\83м|Ñ\87Ñ\83Ñ\80Ñ\83мла}} Ñ\8eÑ\87Ñ\8eн:",
"permissionserrorstext-withaction": "«'''$2'''» этерге амалыгъыз джокъду. {{PLURAL:$1|1=Чуруму|Чурумлары}}:",
"recreate-moveddeleted-warn": "'''Эс бёлюгюз! Сиз алгъын кетерилген бетни джангыдан къураргъа излейсиз'''\n\nБетни джангыдан къураргъа кереклигине сагъыш этигиз.\nБетни кетериу бла атын тюрлендирилиуню журналы тюбюнде кёргюзюлгенди.",
"moveddeleted-notice": "Бу бет кетерилгенди.\nХапарлашдырыу ючюн тюбюрек кетериуле бла ат тюрлендириулени журналы берилгенди.",
"difference-missing-revision": "Бу тенглешдириу ($1) ючюн {{PLURAL:$2|бир версия|$2 версия}} {{PLURAL:$2|табылмады}}.\n\n\nБу, эскирген джибериу бла кетерилген бетни версияларын тенглешдириуге кёчген сагъатда кёбюсюне болады.\nТолуракъ информация [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} кетериулени журналында] болургъа боллукъду.",
"searchresults": "Излеуню эсеби",
"searchresults-title": "«$1» ючюн излеуню эсеблери",
- "toomanymatches": "Асыры кёб бирчалыкъ барды, джангыдан соруу джиберирге кюрешигиз",
"titlematches": "Бетлени атында бирчалыкъ барды",
"textmatches": "Бетлени текстлеринде бирчалыкъла барды",
"notextmatches": "Бетлени текстлеринде бирчалыкъ джокъду",
"pageinfo-category-pages": "Бетлени саны",
"pageinfo-category-subcats": "Тюбкатегорияланы саны",
"pageinfo-category-files": "Файлланы саны",
- "skinname-monobook": "Моно-китаб",
- "skinname-vector": "Вектор",
"markaspatrolleddiff": "Контроль этилгенин белгиле",
"markaspatrolledtext": "Сыналгъан статья кибик белгиле",
"markedaspatrolled": "Сыналгъан кибик белгиленнгенди",
"qbmyoptions": "Ming Sigge",
"faq": "FAQ",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Ne neue Afschnet onge draan!",
- "vector-action-delete": "Fottschmiiße!",
- "vector-action-move": "Ömnänne!",
- "vector-action-protect": "Schöze!",
- "vector-action-undelete": "Zerökholle!",
- "vector-action-unprotect": "Schoz ändere!",
- "vector-view-create": "Neu Schriive!",
- "vector-view-edit": "Ändere!",
- "vector-view-history": "Versione zeije!",
- "vector-view-view": "Lesse!",
- "vector-view-viewsource": "Wikitex aanlooere!",
"actions": "Akßjuhne",
"namespaces": "Appachtemangs",
"variants": "Variante",
"difference-missing-revision": "{{PLURAL:$2|Ein Version|$2 Versione}} vun heh däm Verjlisch zwesche Versione ($1) {{PLURAL:$2|hammer}} nit jefonge.\n\nEsu jät kütt för jewöhnlesch, wam_mer enem övverhollte Lengk ob der Ongerscheid zwesche de Versione vun en Sigg follesch, di zweschedren fottjeschmeße woode es.\nMieh doh drövver fengk mer em [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Logbooch vum Sigge Fottschmiiße].",
"searchresults": "Wat beim Söke eruskom",
"searchresults-title": "Noh „$1“ jesoht.",
- "toomanymatches": "Dat wore zo vill Treffer, beß esu joot, un donn en annder Ußwahl probeere!",
"titlematches": "Zopass Üvverschrefte",
"textmatches": "Sigge met däm Täx",
"notextmatches": "Kein Sigg met däm Tex",
"tooltip-summary": "Jif en koote Zesammefassung en",
"interlanguage-link-title": "$1 ($2)",
"common.css": "/* CSS heh aan dä Stell hät Uswirkunge op all Ovverflääsche */",
- "monobook.css": "/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Monobooch“ */",
- "vector.css": "/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Vector“ */",
"print.css": "/* CSS heh aan dä Stell wirrek nur op et Sigge Drökke */",
"noscript.css": "/* Dat CSS heh aan dä Stell krijje nur de Metmaacher met affjeschaldt JavaSkrepp jescheck */",
"group-autoconfirmed.css": "/* Dat CSS heh aan dä Stell krijje nur de automattesch beshtääteshte Metmacher jescheck */",
"group-sysop.css": "/* Dat CSS heh aan dä Stell krijje nur dem Wiki sing Köbeße jescheck */",
"group-bureaucrat.css": "/* Dat CSS heh aan dä Stell krijje nur de Bürrokraate jescheck */",
"common.js": "/* Jedes JavaScrip hee kütt för jede Metmaacher in jede Sigg erinn */",
- "monobook.js": "/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch \"Monnobooch\" jescheck */",
- "vector.js": "/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch \"Vector\" jescheck */",
"group-autoconfirmed.js": "/* De JavaSkreppte fun hee krijje bloß de autemattesch beshtääteschte Metmaacher jescheck */",
"group-bot.js": "/* De JavaSkreppte fun hee krijje bloß de Bots jescheck */",
"group-sysop.js": "/* De JavaSkreppte fun hee krijje bloß de Wiki_Köbeße jescheck */",
"pageinfo-category-pages": "De Aanzahl Sigge",
"pageinfo-category-subcats": "De Aanzahl Ongerjroppe",
"pageinfo-category-files": "De Aanzahl Dateie",
- "skinname-monobook": "MonoBoch",
- "skinname-vector": "Vektor",
"markaspatrolleddiff": "Nohjeluurt. Dun dat fasshallde.",
"markaspatrolledtext": "De Änderung es nohjeluert, dun dat fasshallde",
"markedaspatrolled": "Et Kennzeiche „Nohjeluurt“ speichere",
"qbmyoptions": "Paginae meae",
"faq": "Quaestiones frequentes",
"faqpage": "Project:Quaestiones frequentes",
- "vector-action-addsection": "Partem novam addere",
- "vector-action-delete": "Delere",
- "vector-action-move": "Movere",
- "vector-action-protect": "Protegere",
- "vector-action-undelete": "Restituere",
- "vector-action-unprotect": "Protectionem mutare",
- "vector-view-create": "Creare",
- "vector-view-edit": "Recensere",
- "vector-view-history": "Historiam inspicere",
- "vector-view-view": "Legere",
- "vector-view-viewsource": "Fontem inspicere",
"actions": "Actiones",
- "vector-more-actions": "Plus",
"namespaces": "Spatia nominalia",
"variants": "Variantes",
"errorpagetitle": "Erratum",
"right-edit": "Paginas recensere",
"right-createpage": "Paginas creare (sine paginis disputationis)",
"right-createtalk": "Paginas disputationis creare",
- "right-createaccount": "Rationes usoris novas creare",
+ "right-createaccount": "Rationes usorum novas creare",
"right-minoredit": "Recensiones minores designare",
"right-move": "Paginas movere",
"right-move-subpages": "Paginas una cum subpaginis movere",
"qbmyoptions": "Meng Säiten",
"faq": "FAQ",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Sujet derbäisetzen",
- "vector-action-delete": "Läschen",
- "vector-action-move": "Réckelen",
- "vector-action-protect": "Spären",
- "vector-action-undelete": "Restauréieren",
- "vector-action-unprotect": "Spär änneren",
- "vector-view-create": "Uleeën",
- "vector-view-edit": "Änneren",
- "vector-view-history": "Versioune weisen",
- "vector-view-view": "Liesen",
- "vector-view-viewsource": "Quellcode weisen",
"actions": "Aktiounen",
- "vector-more-actions": "Méi",
"namespaces": "Nummraim",
"variants": "Varianten",
"navigation-heading": "Navigatiounsmenü",
"difference-missing-revision": "{{PLURAL:$2|Eng Versioun|$2 Versioune}} vun dëser Differenz ($1) {{PLURAL:$2|gouf|goufen}} net fonnt.\n\nDat geschitt normalerweis wann Dir op e vereelste Link vun enger Versioun vun enger Säit klickt déi geläscht ginn ass.\nDetailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Logbuch vum Läschen].",
"searchresults": "Resultat vum Sichen",
"searchresults-title": "Resultater vum Sichen no \"$1\"",
- "toomanymatches": "Zevill Resultater goufe fonnt, versicht w.e.g. eng aner Ufro",
"titlematches": "Iwwereneestëmmungen am Säitentitel",
"textmatches": "Iwwereneestëmmungen am Säitentext",
"notextmatches": "Keng Iwwereneestëmmungen",
"largefileserver": "Dëse Fichier ass méi grouss wéi déi um Server agestallte Maximalgréisst.",
"emptyfile": "De Fichier deen Dir eropgelueden hutt, schéngt eidel ze sinn. Dëst kann duerch en Tippfeeler am Numm vum Fichier kommen. Préift w.e.g. no, op Dir dëse Fichier wierklech eropluede wëllt.",
"windows-nonascii-filename": "Dës Wiki ënnerstëtzt d'Spezialzeechen an de Fichiersnimm net.",
- "fileexists": "Et gëtt schonn e Fichier mat dësem Numm, kuckt w.e.g.\n<strong>[[:$1]]</strong> wann Dir net sécher sidd, ob Dir den Numm ännere wëllt.\n[[$1|thumb]]",
+ "fileexists": "Et gëtt schonn e Fichier mat dësem Numm, kuckt w.e.g.\n<strong>[[:$1]]</strong> no wann {{GENDER:|Dir}} net sécher sidd, ob Dir en ännere wëllt.\n[[$1|thumb]]",
"filepageexists": "D'Beschreiwungssäit fir dëse Fichier gouf schonn als <strong>[[:$1]]</strong> ugeluecht, et gëtt awer kee Fichier mat deem Numm.\n\nDe Resumé deen Dir agitt, gëtt net op d'Beschreiwungssäit iwwerholl.\nFir datt Äre Resumé do opdaucht musst Dir e manuell änneren.\n[[$1|thumb]]",
- "fileexists-extension": "E Fichier mat engem ähnlechen Numm gëtt et schonn: [[$2|thumb]]\n* Numm vum Fichier deen Dir versicht eropzelueden: <strong>[[:$1]]</strong>\n* Numm vum Fichier deen et scho gëtt: <strong>[[:$2]]</strong>\nWielt w.e.g. en aneren Numm.",
+ "fileexists-extension": "E Fichier mat engem ähnlechen Numm gëtt et schonn: [[$2|thumb]]\n* Numm vum Fichier fir eropzelueden: <strong>[[:$1]]</strong>\n* Numm vum Fichier deen et scho gëtt: <strong>[[:$2]]</strong>\nWëllt Dir eventuell méi en expliziten Numm benotzen?",
"fileexists-thumbnail-yes": "Beim Fichier schéngt et sech ëm e klengt Bild ''(Miniatur)'' ze handelen. [[$1|thumb]]\nKuckt de Fichier <strong>[[:$1]]</strong> w.e.g. no.\nWann et sech ëm d'Bild an der Originalgréisst handelt, da brauch kee separat Bild als Miniatur eropgelueden ze ginn.",
"file-thumbnail-no": "Den Numm vum Fichier fänkt mat <strong>$1</strong> un.\nDa deit drop hin datt et eng Minitaur ''(thumbnail)'' ass.\nWann Dir dat Bild a méi enger grousser Opléisung hutt, da luet dëst erop, wann net dann ännert w.e.g. den Numm vum Fichier.",
"fileexists-forbidden": "Et gëtt schonn e Fichier mat dësem Numm an dee kann net iwwerschriwwe ginn.\nWann Dir de Fichier nach ëmmer eropluede wëllt, da gitt w.e.g. zréck a benotzt en neien Numm. [[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "Läschen a Restauréiere vu Fichieren temporär ausgeschalt wéinst Maintenance.",
"filedelete-maintenance-title": "De Fichier kann net geläscht ginn",
"mimesearch": "No MIME-Zort sichen",
- "mimesearch-summary": "Op dëser Spezialsäit kënnen d'Fichieren no hirem MIME-Typ gefiltert ginn.\nDir musst ëmmer de Medien- a Subtyp aginn: z. Bsp. <code>image/jpeg</code>.",
+ "mimesearch-summary": "Op dëser Spezialsäit kënnen d'Fichieren no hirem MIME-Typ gefiltert ginn.\nDir musst de Medien- a Subtyp respektiv den Typ vum Inhalt aginn: z. Bsp. <code>image/jpeg</code>.",
"mimetype": "MIME-Typ:",
"download": "eroflueden",
"unwatchedpages": "Net iwwerwaacht Säiten",
"tooltip-preferences-save": "Astellunge späicheren",
"tooltip-summary": "Gitt e kuerze Resumé an",
"interlanguage-link-title": "$1 - $2",
+ "interlanguage-link-title-nonlang": "$1 - $2",
"common.css": "/* Dës CSS huet nëmmen Afloss op de Skin ''Chick'' */",
- "monobook.css": "/* Dës CSS huet nëmmen Afloss op de Skin ''Monobook'' */",
"common.js": "/* All JavaScript hei gëtt fir all Benotzer beim Luede vun all Säit gelueden. */",
"anonymous": "{{PLURAL:$1|Anonyme Benotzer|Anonym Benotzer}} op {{SITENAME}}",
"siteuser": "{{SITENAME}}-Benotzer $1",
"pageinfo-category-pages": "Zuel vun de Säiten",
"pageinfo-category-subcats": "Zuel vun den Ënnerkategorien",
"pageinfo-category-files": "Zuel vun de Fichieren",
- "skinname-monobook": "MonoBook",
"markaspatrolleddiff": "Als nogekuckt markéieren",
"markaspatrolledtext": "Dës Säit als nogekuckt markéieren",
"markedaspatrolled": "ass als nogekuckt markéiert",
"version-hook-name": "Numm vun der Klamer",
"version-hook-subscribedby": "Opruff vum",
"version-version": "(Versioun $1)",
+ "version-no-ext-name": "[keen Numm]",
"version-license": "MediaWiki-Lizenz",
"version-ext-license": "Lizenz",
"version-ext-colheader-name": "Erweiderung",
"qbmyoptions": "I mè paginn",
"faq": "FAQ",
"faqpage": "Project:Dumand frequent",
- "vector-action-addsection": "Giunta argument",
- "vector-action-delete": "Scancela",
- "vector-action-move": "Sposta",
- "vector-action-protect": "Prutegg",
- "vector-action-undelete": "Recüpera",
- "vector-action-unprotect": "Càmbia la protesiù",
- "vector-view-create": "Crea",
- "vector-view-edit": "Mudifega",
- "vector-view-history": "Varda la storia",
- "vector-view-view": "Legg",
- "vector-view-viewsource": "Varda el codes",
"actions": "Azión",
- "vector-more-actions": "Amò",
"namespaces": "Namespace",
"variants": "Variant",
"navigation-heading": "Menù de navigasiù",
"diff-empty": "(Nesöna diferènsa)",
"searchresults": "Risültaa de la recerca.",
"searchresults-title": "Resültaa de la ricerca de \"$1\"",
- "toomanymatches": "Gh'è tropi curispundens. Mudifichè la richiesta.",
"titlematches": "Corespondènse endel tìtol de le pàgine",
"textmatches": "Truvaa int 'l test di paginn",
"notextmatches": "La vus che t'hee ciamaa la gh'ha minga una curispundenza in del test di paginn.",
"qbmyoptions": "بلگيا مه",
"faq": "اف ای كيو",
"faqpage": "پروجه:اف اي كيو",
- "vector-action-addsection": "موضوع اضاف بكيد",
- "vector-action-delete": "حذف بكيد",
- "vector-action-move": "جاوه جا بوئيت",
- "vector-action-protect": "حمايت بكيد",
- "vector-action-undelete": "حذف نبيئني",
- "vector-action-unprotect": "حمايت آلشت بكيد",
- "vector-view-create": "راس كردن",
- "vector-view-edit": "ويرايشت",
- "vector-view-history": "ديئن ويرگار",
- "vector-view-view": "حنن",
- "vector-view-viewsource": "سرچشمه نه بوينيت",
"actions": "جمشت",
"namespaces": "نوم جا",
"variants": "آلشت ونی يا",
"qbmyoptions": "Manas lapas",
"faq": "BUJ",
"faqpage": "Project:BUJ",
- "vector-action-addsection": "Jauna sadaļa",
- "vector-action-delete": "Dzēst",
- "vector-action-move": "Pārvietot",
- "vector-action-protect": "Aizsargāt",
- "vector-action-undelete": "Atjaunot",
- "vector-action-unprotect": "Mainīt aizsardzību",
- "vector-view-create": "Izveidot",
- "vector-view-edit": "Labot",
- "vector-view-history": "Hronoloģija",
- "vector-view-view": "Skatīt",
- "vector-view-viewsource": "Aplūkot kodu",
"actions": "Darbības",
"namespaces": "Vārdtelpas",
"variants": "Varianti",
"diff-multi-manyusers": "({{PLURAL:$1|Viena starpversija|$1 starpversijas}}, ko saglabājuši vairāk nekā $2 {{PLURAL:$2|lietotājs|lietotāji}}, nav parādīta{{PLURAL:$1||s}})",
"searchresults": "Meklēšanas rezultāti",
"searchresults-title": "Meklēšanas rezultāti \"$1\"",
- "toomanymatches": "Tika atgriezti poārāk daudzi rezultāti, lūdzu pamēģini citādāku pieprasījumu",
"titlematches": "Rezultāti virsrakstos",
"textmatches": "Rezultāti lapu tekstos",
"notextmatches": "Neviena rezultāta, meklējot lapas tekstā",
"qbmyoptions": "Ny pejiko",
"faq": "FMM",
"faqpage": "Project:FMM",
- "vector-action-addsection": "Hanampy lohahevitra",
- "vector-action-delete": "Fafana",
- "vector-action-move": "Hanolo anarana",
- "vector-action-protect": "Arovy",
- "vector-action-undelete": "Avereno",
- "vector-action-unprotect": "Hanala ny fiarovana",
- "vector-view-create": "Foronona",
- "vector-view-edit": "Hanova",
- "vector-view-history": "Hijery ny tantara",
- "vector-view-view": "Hamaky",
- "vector-view-viewsource": "Hijery fango",
"actions": "Tao",
"namespaces": "Valam-pejy",
"variants": "Ny ''skin'' Voasintona",
"difference-missing-revision": "Tsy hita ny versiona $2{{PLURAL:$2||}} ny fahasamihafanna ($1) an'ity pejy ity.\n\nVokatry ny fanarahana rohy fampitahana lany daty mankany amy pejy efa voafafa izan . Ho hita eo amin'ny [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} laogim-pamafàna] ny antsipirihany.",
"searchresults": "Valim-pikarohana",
"searchresults-title": "Valim-pikarohana ho an'ny « $1 »",
- "toomanymatches": "Betsaka loatra ny isan'ny mitovy naverina, mametraha fangatahana hafa.",
"titlematches": "Mifanitsy amin'ny lohatenin'ny lahatsoratra",
"textmatches": "Mifanitsy amin'ny votoatin'ny pejy",
"notextmatches": "Tsy nahitana votoatim-pejy mifanaraka",
"tooltip-undo": "Manala n'io fanovàna io ilay rohy « esory ».\nMamerina ny version taloha io asa io ary afaka manometraka ny antony anatin'ny ambangovangony.",
"tooltip-preferences-save": "Tehirizina ny safidy",
"tooltip-summary": "Atsofohy eo ambangovangony fohifohy",
- "monobook.css": "/* Ovay ity rakitra ity raha hampiasa takilan'angaly (stylesheet) anao manokana amin'ny wiki iray manontolo */",
"anonymous": "Mpikambana {{PLURAL:$1}} tsy mitonona anarana eto amin'ny {{SITENAME}}",
"siteuser": "{{SITENAME}} mpikambana $1",
"anonuser": "ny mpikambana tsy nisoratra anarana $1 an'i {{SITENAME}}",
"qbmyoptions": "Мои страници",
"faq": "ЧПП",
"faqpage": "Project:ЧПП",
- "vector-action-addsection": "Додај тема",
- "vector-action-delete": "Избриши",
- "vector-action-move": "Премести",
- "vector-action-protect": "Заштити",
- "vector-action-undelete": "Врати",
- "vector-action-unprotect": "Измени заштита",
- "vector-view-create": "Создај",
- "vector-view-edit": "Уреди",
- "vector-view-history": "Историја",
- "vector-view-view": "Читај",
- "vector-view-viewsource": "Извор",
"actions": "Дејства",
- "vector-more-actions": "Повеќе",
"namespaces": "Именски простори",
"variants": "Варијанти",
"navigation-heading": "Навигационо мени",
"mergehistory-empty": "Нема преработки кои можат да се спојат.",
"mergehistory-success": "$3 {{PLURAL:$3|преработка |преработки}} на [[:$1]] успешно {{PLURAL:$3|е споена|се споени}} во [[:$2]].",
"mergehistory-fail": "Не е возможно да се направи спојување на историјата, проверете ја страницата и временските параметри.",
+ "mergehistory-fail-toobig": "Не можам да извршам спојување на историјата бидејќи така ќе се надмине границата од {{PLURAL:$1|една преработка|$1 преработки}}.",
"mergehistory-no-source": "Изворната страница $1 не постои.",
"mergehistory-no-destination": "Целната страница $1 не постои.",
"mergehistory-invalid-source": "Изворната страница мора да има важечки наслов.",
"difference-missing-revision": "Не пронајдов {{PLURAL:$2|една преработка|$2 преработки}} од оваа разлика ($1).\n\nОва обично се должи на застарена врска за разлики што води кон избришана страница.\nПовеќе подробности ќе најдете во [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневникот на бришења].",
"searchresults": "Резултати од пребарувањето",
"searchresults-title": "Резултати од пребарувањето на „$1“",
- "toomanymatches": "Премногу резултати од пребарувањето, ве молиме обидете се со поинакво барање",
"titlematches": "Совпаднати наслови",
"textmatches": "Совпаднат текст во страниците",
"notextmatches": "Ниеден текст во статиите не одговара",
"largefileserver": "Големината на оваа податотека е поголема од максимално дозволената големина од серверот.",
"emptyfile": "Податотеката што ја подигнавте е празна.\nОва може да се должи на грешка во нејзиното име.\nПроверете дали навистина сакате да ја подигнете ваквата податотека.",
"windows-nonascii-filename": "Опслужувачот не поддржува податотечни имиња со специјални знаци.",
- "fileexists": "Податотека со ова име веќе постои, проверете <strong>[[:$1]]</strong> ако не сте сигурни дали сакате да го промените.\n[[$1|thumb]]",
+ "fileexists": "Податотека со ова име веќе постои. Проверете <strong>[[:$1]]</strong> ако не {{GENDER:|сте}} сигурни дали сакате да ја промените.\n[[$1|thumb]]",
"filepageexists": "Страницата за опис на оваа податотека е веќе создадена на <strong>[[:$1]]</strong>, но не постои податотека со тоа име.\nОписот кој го внесовте нема да стои на страницата за опис.\nДоколку сакате описот да стои тука, ќе морате да го уредите рачно.\n[[$1|thumb]]",
- "fileexists-extension": "Податотека со слично име веќе постои: [[$2|thumb]]\n* Име на податотека која се подигнува: <strong>[[:$1]]</strong>\n* Име на постоечка податотека: <strong>[[:$2]]</strong>\nВе молиме изберете друго име за податотеката.",
+ "fileexists-extension": "Податотека со слично име веќе постои: [[$2|thumb]]\n* Име на податотека која се подигнува: <strong>[[:$1]]</strong>\n* Име на постоечката податотека: <strong>[[:$2]]</strong>\nДали можеби би сакале да користите покарактеристично име.",
"fileexists-thumbnail-yes": "Се чини дека податотеката е слика со намалена големина ''(минијатура)''. [[$1|thumb]]\nПроверете ја податотеката <strong>[[:$1]]</strong>.\nАко податотеката која ја проверувате е истата слика во својата изворна големина тогаш не мора да ја подигате дополнително.",
"file-thumbnail-no": "Името на податотеката почнува со <strong>$1</strong>.\nИзгледа дека е слика со намалена големина ''(мини, thumbnail)''.\nАко ја имате оваа слика во изворна големина, подигнете ја неја. Во спротивно сменете го името на податотеката.",
"fileexists-forbidden": "Податотека со тоа име веќе постои и не може да биде заменета.\nАко и понатаму сакате да ја подигнете вашата податотеката, ве молиме вратете се назад и подигнете ја под друго име. [[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "Бришење и враќање на податотеки е привремено оневозможено поради одржување на базата на податоци.",
"filedelete-maintenance-title": "Не можам да ја избришам податотеката",
"mimesearch": "Пребарување по MIME",
- "mimesearch-summary": "Ð\9eваа Ñ\81Ñ\82Ñ\80аниÑ\86а овозможÑ\83ва Ñ\84илÑ\82Ñ\80иÑ\80аÑ\9aе на подаÑ\82оÑ\82еки вÑ\80з оÑ\81нова на нивниоÑ\82 MIME-Ñ\82ип.\nФоÑ\80маÑ\82 на вноÑ\81: Ñ\82ип на Ñ\81одÑ\80жина/поÑ\82Ñ\82ип, на пр. <code>image/jpeg</code>.",
+ "mimesearch-summary": "Ð\9eваа Ñ\81Ñ\82Ñ\80аниÑ\86а овозможÑ\83ва Ñ\84илÑ\82Ñ\80иÑ\80аÑ\9aе на подаÑ\82оÑ\82еки вÑ\80з оÑ\81нова на нивниоÑ\82 MIME-Ñ\82ип.\nÐ\92ноÑ\81: Ñ\82ипнаÑ\81одÑ\80жина/поÑ\82Ñ\82ип или Ñ\82ипнаÑ\81одÑ\80жина/, на пр. <code>image/jpeg</code>.",
"mimetype": "MIME-тип:",
"download": "преземи",
"unwatchedpages": "Ненабљудувани страници",
"tooltip-preferences-save": "Зачувај",
"tooltip-summary": "Внесете краток опис",
"interlanguage-link-title": "$1 — $2",
+ "interlanguage-link-title-nonlang": "$1 — $2",
"common.css": "/* Тука поставениот CSS ќе се применува врз сите рува */",
- "monobook.css": "/* Тука поставениот CSS ќе се применува врз корисниците на рувото „Монобук“ */",
- "vector.css": "/* Тука поставениот CSS се однесува на корисниците на рувото „Векторско“ */",
"print.css": "/* Тука поставениот CSS ќе се применува во верзијата за печатење */",
"noscript.css": "/* Тука поставениот CSS се однесува на корисниците што имаат оневозможено JavaScript */",
"group-autoconfirmed.css": "/* Тука поставениот CSS ќе се применува само на автопотврдените корисници */",
"group-sysop.css": "/* Тука поставениот CSS ќе се применува само врз системските оператори */",
"group-bureaucrat.css": "/* Тука поставениот CSS ќе се применува само врз бирократите */",
"common.js": "/* Тука поставениот JavaScript ќе им се вчитува на сите корисници при отворањето на секоја страница. */",
- "monobook.js": "/* Тука поставениот JavaScript ќе им се вчитува на корисниците што го користат рувото „Монобук“ */",
- "vector.js": "/* Тука поставениот JavaScript ќе им се вчитува на корисниците што го користат рувото „Векторско“ */",
"group-autoconfirmed.js": "/* Тука поставениот JavaScript ќе им се вчитува само на автопотврдените корисници */",
"group-user.js": "/* Тука поставениот JavaScript ќе им се вчитува само на регистрираните корисници */",
"group-bot.js": "/* Тука поставениот JavaScript ќе им се вчитува само на ботовите */",
"pageinfo-category-pages": "Број на страници",
"pageinfo-category-subcats": "Број на поткатегории",
"pageinfo-category-files": "Број на податотеки",
- "skinname-monobook": "Монобук",
- "skinname-vector": "Векторско",
"markaspatrolleddiff": "Означи како проверена верзија",
"markaspatrolledtext": "Означи ја верзијата како проверена",
"markedaspatrolled": "Означено како проверено",
"version-hook-name": "Име на кука",
"version-hook-subscribedby": "Претплатено од",
"version-version": "(Верзија $1)",
+ "version-no-ext-name": "[нема име]",
"version-svn-revision": "прер. $1",
"version-license": "Лиценца на МедијаВики",
"version-ext-license": "Лиценца",
"qbmyoptions": "എന്റെ താളുകൾ",
"faq": "പതിവുചോദ്യങ്ങൾ",
"faqpage": "Project:പതിവുചോദ്യങ്ങൾ",
- "vector-action-addsection": "വിഷയം ചേർക്കുക",
- "vector-action-delete": "മായ്ക്കുക",
- "vector-action-move": "തലക്കെട്ട് മാറ്റുക",
- "vector-action-protect": "സംരക്ഷിക്കുക",
- "vector-action-undelete": "മായ്ക്കപ്പെട്ടത് പുനഃസ്ഥാപിക്കുക",
- "vector-action-unprotect": "സംരക്ഷണത്തിൽ മാറ്റംവരുത്തുക",
- "vector-view-create": "സൃഷ്ടിക്കുക",
- "vector-view-edit": "തിരുത്തുക",
- "vector-view-history": "നാൾവഴി കാണുക",
- "vector-view-view": "വായിക്കുക",
- "vector-view-viewsource": "മൂലരൂപം കാണുക",
"actions": "നടപടികൾ",
- "vector-more-actions": "കൂടുതൽ",
"namespaces": "നാമമേഖല",
"variants": "രൂപഭേദങ്ങൾ",
"navigation-heading": "ഗമന വഴികാട്ടി",
"difference-missing-revision": "ഈ വ്യത്യാസത്തിൽ ($1) {{PLURAL:$2|ഒരു നാൾപ്പതിപ്പ്|$2 നാൾപ്പതിപ്പുകൾ}} കാണാനായില്ല.\n\nമായ്ക്കപ്പെട്ട താളിന്റെ കാലഹരണപ്പെട്ട നാൾവഴി കണ്ണി ഉപയോഗിച്ചാലാണ് സാധാരണ ഇങ്ങനെ സംഭവിക്കുക.\nകൂടുതൽ വിവരങ്ങൾ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} മായ്ക്കൽ രേഖയിൽ] കാണാവുന്നതാണ്.",
"searchresults": "തിരച്ചിലിന്റെ ഫലം",
"searchresults-title": "\"$1\" എന്നു തിരഞ്ഞതിനു ലഭ്യമായ ഫലങ്ങൾ",
- "toomanymatches": "യോജിച്ച ഫലങ്ങൾ വളരെയധികം കിട്ടിയിരിക്കുന്നു; ദയവായി വേറൊരു അന്വേഷണ വാക്ക് ഉപയോഗിച്ച് തിരയുക.",
"titlematches": "താളിന്റെ തലക്കെട്ടുമായി യോജിക്കുന്ന ഫലങ്ങൾ",
"textmatches": "താങ്കൾ തിരഞ്ഞ വാക്കുകൾ ഉള്ള താളുകൾ",
"notextmatches": "താളുകളുടെ ഉള്ളടക്കത്തിൽ താങ്കൾ തിരഞ്ഞ വാക്കുമായി യോജിക്കുന്ന ഫലങ്ങൾ ഒന്നും തന്നെയില്ല",
"action-viewmyprivateinfo": "താങ്കളുടെ സ്വകാര്യവിവരങ്ങൾ കാണുക",
"action-editmyprivateinfo": "താങ്കളുടെ സ്വകാര്യവിവരങ്ങൾ തിരുത്തുക",
"nchanges": "{{PLURAL:$1|ഒരു മാറ്റം|$1 മാറ്റങ്ങൾ}}",
- "enhancedrc-since-last-visit": "കഴിഞ്ഞ സന്ദർശനത്തിനു ശേഷം {{PLURAL:$1|ഒരെണ്ണം|$1 എണ്ണം}}.",
+ "enhancedrc-since-last-visit": "കഴിഞ്ഞ സന്ദർശനത്തിനു ശേഷം {{PLURAL:$1|ഒരെണ്ണം|$1 എണ്ണം}}",
"enhancedrc-history": "നാൾവഴി",
"recentchanges": "സമീപകാല മാറ്റങ്ങൾ",
"recentchanges-legend": "സമീപകാല മാറ്റങ്ങളുടെ ക്രമീകരണം",
"largefileserver": "സെർവറിൽ ചിട്ടപ്പെടുത്തിയതുപ്രകാരം ഈ പ്രമാണത്തിന്റെ വലിപ്പം അനുവദനീയമായതിലും കൂടുതലാണ്.",
"emptyfile": "താങ്കൾ അപ്ലോഡ് ചെയ്ത പ്രമാണം ശൂന്യമാണെന്നു കാണുന്നു.\nപ്രമാണത്തിന്റെ പേരിലുള്ള അക്ഷരത്തെറ്റായിരിക്കാം ഇതിനു കാരണം.\nഈ പ്രമാണം അപ്ലോഡ് ചെയ്യണോ എന്നൊരിക്കൽ കൂടി പരിശോധിക്കുക.",
"windows-nonascii-filename": "പ്രത്യേകാക്ഷരങ്ങളുള്ള പ്രമാണനാമങ്ങൾ ഈ വിക്കി പിന്തുണയ്ക്കുന്നില്ല.",
- "fileexists": "ഇതേ പേരിൽ വേറെ ഒരു പ്രമാണം നിലവിലുണ്ട്.\nദയവായി <strong>[[:$1]]</strong> പരിശോധിച്ച് പ്രസ്തുത പ്രമാണം മാറ്റണമോ എന്നു തീരുമാനിക്കുക.\n[[$1|thumb]]",
+ "fileexists": "ഇതേ പേരിൽ വേറെ ഒരു പ്രമാണം നിലവിലുണ്ട്.\nദയവായി <strong>[[:$1]]</strong> പരിശോധിച്ച് പ്രസ്തുത പ്രമാണം {{GENDER:|മാറ്റണമോ}} എന്നു തീരുമാനിക്കുക.\n[[$1|thumb]]",
"filepageexists": "ഈ പ്രമാണത്തിനുള്ള വിവരണതാൾ <strong>[[:$1]]</strong> എന്നു സൃഷ്ടിക്കപ്പെട്ടിട്ടുണ്ട്, പക്ഷേ ഇതേ പേരിൽ പ്രമാണം ഒന്നും നിലവിലില്ല.\nവിവരണതാളിൽ താങ്കൾ ഇവിടെ ചേർക്കുന്ന ലഘുകുറിപ്പ് പ്രത്യക്ഷപ്പെടുന്നതല്ല.\nഅവിടെ ലഘുകുറിപ്പ് വരാൻ ആ താൾ താങ്കൾ സ്വയം തിരുത്തേണ്ടതാണ്.\n[[$1|ലഘുചിത്രം]]",
"fileexists-extension": "ഇതേ പേരിൽ മറ്റൊരു പ്രമാണം നിലവിലുണ്ട്: [[$2|ലഘുചിത്രം]]\n* ഇപ്പോൾ അപ്ലോഡ് ചെയ്ത പ്രമാണത്തിന്റെ പേര്: <strong>[[:$1]]</strong>\n* നിലവിലുള്ള പ്രമാണത്തിന്റെ പേര്: <strong>[[:$2]]</strong>\nമറ്റൊരു പേരു തിരഞ്ഞെടുക്കുക.",
"fileexists-thumbnail-yes": "ഈ ചിത്രം വലിപ്പം കുറച്ച ഒന്നാണെന്നു ''(ലഘുചിത്രം)'' കാണുന്നു.\n[[$1|ലഘുചിത്രം]]\nദയവായി <strong>[[:$1]]</strong> എന്ന ചിത്രം പരിശോധിക്കുക.\n[[:$1]] എന്ന ചിത്രവും ഈ ചിത്രവും ഒന്നാണെങ്കിൽ ലഘുചിത്രത്തിനു വേണ്ടി മാത്രമായി ചിത്രം അപ്ലോഡ് ചെയ്യേണ്ടതില്ല.",
"wantedtemplates": "അവശ്യ ഫലകങ്ങൾ",
"mostlinked": "ഏറ്റവുമധികം കണ്ണികളാൽ ചേർത്തിരിക്കുന്ന താളുകൾ",
"mostlinkedcategories": "ഏറ്റവുമധികം താളുകൾ ചേർത്തിട്ടുള്ള വർഗ്ഗങ്ങൾ",
- "mostlinkedtemplates": "à´\8fà´±àµ\8dറവàµ\81മധിà´\95à´\82 à´\95à´£àµ\8dണി à´\9aàµ\87ർതàµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´«à´²à´\95à´\99àµ\8dà´\99ൾ",
+ "mostlinkedtemplates": "à´\8fà´±àµ\8dറവàµ\81മധിà´\95à´\82 à´\89ൾപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dതിയിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ താളàµ\81à´\95ൾ",
"mostcategories": "ഏറ്റവുമധികം വർഗ്ഗങ്ങൾ ഉൾപ്പെടുത്തിയിരിക്കുന്ന താളുകൾ",
"mostimages": "ഏറ്റവുമധികം കണ്ണി ചേർത്തിരിക്കുന്ന പ്രമാണങ്ങൾ",
"mostinterwikis": "ഏറ്റവുമധികം അന്തർവിക്കികളുള്ള താളുകൾ",
"tooltip-preferences-save": "ക്രമീകരണങ്ങൾ ഓർത്തുവെയ്ക്കുക",
"tooltip-summary": "ചെറിയൊരു ചുരുക്കം ചേർക്കുക",
"common.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. എല്ലാ ദൃശ്യരൂപങ്ങൾക്കും ബാധകമായിരിക്കും */",
- "monobook.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. മോണോബുക്ക് ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */",
- "vector.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. വെക്റ്റർ ദൃശ്യരൂപത്തിനു ബാധകമായിരിക്കും*/",
"noscript.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്., ജാവാസ്ക്രിപ്റ്റ് സജ്ജമാക്കിയിട്ടില്ലാത്ത ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും */",
"group-autoconfirmed.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. യാന്ത്രികമായി സ്ഥിരീകരിച്ച ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും */",
"group-bot.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. ബോട്ടുകൾക്ക് ബാധകമായിരിക്കും */",
"group-sysop.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. കാര്യനിർവാഹകർക്ക് ബാധകമായിരിക്കും */",
"group-bureaucrat.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. ബ്യൂറോക്രാറ്റുകൾക്ക് ബാധകമായിരിക്കും */",
"common.js": "/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് എല്ലാ ഉപയോക്താക്കൾക്കും, എല്ലാ താളുകളിലും പ്രവർത്തിക്കുന്നതായിരിക്കും */",
- "monobook.js": "/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് മോണോബുക്ക് ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */",
- "vector.js": "/*ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് വെക്റ്റർ ദൃശ്യരൂപം ഉപയോഗിക്കുന്ന ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും*/",
"group-autoconfirmed.js": "/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് യാന്ത്രികമായി സ്ഥിരീകരിക്കപ്പെട്ട ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും */",
"group-bot.js": "/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് ബോട്ടുകൾക്ക് ബാധകമായിരിക്കും */",
"group-sysop.js": "/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് കാര്യനിർവാഹകർക്ക് ബാധകമായിരിക്കും */",
"pageinfo-category-pages": "താളുകളുടെ എണ്ണം",
"pageinfo-category-subcats": "ഉപവർഗ്ഗങ്ങളുടെ എണ്ണം",
"pageinfo-category-files": "പ്രമാണങ്ങളുടെ എണ്ണം",
- "skinname-monobook": "മോണോബുക്ക്",
- "skinname-vector": "വെക്റ്റർ",
"markaspatrolleddiff": "റോന്തുചുറ്റിയതായി അടയാളപ്പെടുത്തുക",
"markaspatrolledtext": "ഈ താളിൽ റോന്തുചുറ്റിയതായി രേഖപ്പെടുത്തുക",
"markedaspatrolled": "റോന്തുചുറ്റിയതായി രേഖപ്പെടുത്തിയിരിക്കുന്നു",
"qbmyoptions": "Миний хуудсууд",
"faq": "Тогтмол тавигддаг асуултууд",
"faqpage": "Project:Тогтмол тавигддаг асуултууд",
- "vector-action-addsection": "Сэдэв нэмэх",
- "vector-action-delete": "Устгах",
- "vector-action-move": "Зөөх",
- "vector-action-protect": "Хамгаалах",
- "vector-action-undelete": "Үл устгах",
- "vector-action-unprotect": "Хамгаалалтаа солих",
- "vector-view-create": "Үүсгэх",
- "vector-view-edit": "Засварлах",
- "vector-view-history": "Түүх",
- "vector-view-view": "Унших",
- "vector-view-viewsource": "Кодыг харах",
"actions": "Үйлдлүүд",
"namespaces": "Хуудсын төрөл",
"variants": "Хувилбарууд",
"diff-multi-manyusers": "($2 гаруй {{PLURAL:$2|хэрэглэгчийн}} {{PLURAL:$1|дундын нэг засварыг|дундын $1 засварыг}} үзүүлсэнгүй)",
"searchresults": "Хайлтын үр дүн",
"searchresults-title": "\"$1\" гэх хайлтын үр дүн",
- "toomanymatches": "Хэт олон илэрц илэрлээ. Өөр үгээр хайна уу.",
"titlematches": "Хуудасны гарчигтай таарсан хуудсууд",
"textmatches": "Хуудасны тексттэй таарсан хуудсууд",
"notextmatches": "Хуудасны тексттэй таарсан хуудсууд байхгүй байна",
"qbmyoptions": "माझी पाने",
"faq": "नेहमी विचारण्यात येणारे प्रश्न",
"faqpage": "Project:प्रश्नावली",
- "vector-action-addsection": "विषय जोडा",
- "vector-action-delete": "वगळा",
- "vector-action-move": "स्थानांतरण",
- "vector-action-protect": "सुरक्षित करा",
- "vector-action-undelete": "वगळलेले पुनर्स्थापित करा",
- "vector-action-unprotect": "सुरक्षितता बदला",
- "vector-view-create": "तयार करा",
- "vector-view-edit": "संपादन",
- "vector-view-history": "इतिहास पहा",
- "vector-view-view": "वाचा",
- "vector-view-viewsource": "स्रोत पहा",
"actions": "क्रिया",
- "vector-more-actions": "अधिक",
"namespaces": "नामविश्वे",
"variants": "अस्थिरके",
"navigation-heading": "दिक्चालन यादी",
"difference-missing-revision": "या लेखाचे/ची ($1) हे {{PLURAL:$2|संस्करण|$2 संस्करणे}} {{PLURAL:$2|सापडले नाही|सापडली नाहीत}}.वगळल्या गेलेल्या लेखपानाच्या जुन्या इतिहास-दुव्याचे अनुसरण केल्यामुळे, शक्यतोवर,असे घडु शकते.याबाबत अधिक तपशील [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेल्या नोंदी] येथे बघता येईल.",
"searchresults": "शोध निकाल",
"searchresults-title": "\"$1\" साठीचे शोध निकाल",
- "toomanymatches": "खूप एकसारखी उत्तरे मिळाली, कृपया पृच्छा वेगळ्या तऱ्हेने करून पहा",
"titlematches": "पानाचे शीर्षक जुळते",
"textmatches": "पानातील मजकूर जुळतो",
"notextmatches": "कोणत्याही पानातील मजकुराशी जुळत नाही",
"pageinfo-category-pages": "पानांची संख्या",
"pageinfo-category-subcats": "उपवर्गांची संख्या",
"pageinfo-category-files": "संचिकांची संख्या",
- "skinname-monobook": "मोनोबुक",
- "skinname-vector": "सदिश",
"markaspatrolleddiff": "टेहळणी केल्याची खूण करा",
"markaspatrolledtext": "या पानावर गस्त झाल्याची खूण करा",
"markedaspatrolled": "गस्त केल्याची खूण केली",
"qbmyoptions": "Laman-laman saya",
"faq": "Soalan Lazim",
"faqpage": "Project:Soalan Lazim",
- "vector-action-addsection": "Buka topik",
- "vector-action-delete": "Hapus",
- "vector-action-move": "Pindah",
- "vector-action-protect": "Lindung",
- "vector-action-undelete": "Nyahhapus",
- "vector-action-unprotect": "Ubah perlindungan",
- "vector-view-create": "Cipta",
- "vector-view-edit": "Sunting",
- "vector-view-history": "Lihat sejarah",
- "vector-view-view": "Baca",
- "vector-view-viewsource": "Lihat sumber",
"actions": "Tindakan",
"namespaces": "Ruang nama",
"variants": "Kelainan",
"difference-missing-revision": "{{PLURAL:$2|Satu semakan|$2 semakan}} bagi perbezaan ini ($1) tidak ditemui.\n\nHal ini biasanya disebabkan oleh pautan perbezaan yang lapuk ke halaman yang sudah dihapuskan.\nButirannya boleh didapati di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].",
"searchresults": "Hasil carian",
"searchresults-title": "Hasil carian \"$1\"",
- "toomanymatches": "Terlalu banyak padanan dipulangkan, sila cuba pertanyaan lain",
"titlematches": "Padanan tajuk laman",
"textmatches": "Padanan teks laman",
"notextmatches": "Tiada teks laman yang sepadan",
"tooltip-preferences-save": "Simpan keutamaan",
"tooltip-summary": "Berikan ringkasan",
"common.css": "/* CSS yang terletak di sini akan digunakan pada semua kulit */",
- "monobook.css": "/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Monobook */",
- "vector.css": "/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Vector */",
"anonymous": "{{PLURAL:$1|Pengguna|Pengguna-pengguna}} {{SITENAME}} tanpa nama",
"siteuser": "Pengguna {{SITENAME}}, $1",
"anonuser": "Pengguna {{SITENAME}} tanpa nama $1",
"pageinfo-category-pages": "Bilangan halaman",
"pageinfo-category-subcats": "Bilangan subkategori",
"pageinfo-category-files": "Bilangan fail",
- "skinname-monobook": "MonoBook",
- "skinname-vector": "Vector",
"markaspatrolleddiff": "Tanda ronda",
"markaspatrolledtext": "Tanda ronda laman ini",
"markedaspatrolled": "Tanda ronda",
"Roderick Mallia",
"Urhixidur",
"아라",
- "CharlieTheCabbie"
+ "CharlieTheCabbie",
+ "Leli Forte"
]
},
"tog-underline": "Ħoloq sottolinjati:",
"qbmyoptions": "Il-paġni tiegħi",
"faq": "Mistoqsijiet komuni",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Żid diskussjoni",
- "vector-action-delete": "Ħassar",
- "vector-action-move": "Mexxi",
- "vector-action-protect": "Ipproteġi",
- "vector-action-undelete": "Irkupra",
- "vector-action-unprotect": "Biddel il-protezzjoni",
- "vector-view-create": "Oħloq",
- "vector-view-edit": "Editja",
- "vector-view-history": "Ara l-kronoloġija",
- "vector-view-view": "Aqra",
- "vector-view-viewsource": "Ara s-sors",
"actions": "Azzjonijiet",
"namespaces": "Spazji tal-isem",
"variants": "Varjanti",
"viewsourcetext": "Tista' tara u tikkopja s-sors ta' din il-paġna:",
"viewyourtext": "Tista' tara u tikkopja s-sors tal-'''modifiki tiegħek''' fuq din il-paġna:",
"protectedinterface": "Din il-paġna għanda element li tagħmel parti mill-interfaċċa tal-utent tas-software, u għaldaqstant ġiet protetta sabiex ma jkunx hemm abbuż.",
- "editinginterface": "'''Avviż:''' Qiegħed tagħmel modifiki lejn paġna li qegħdha tintuża biex tipprovdi interfaċċa għall-messaġġi tas-software. Kull modifika f'din il-paġna se taffetwa l-apparenza tal-faċċata tal-utenti kollha. Għat-traduzzjonijiet, ikkunsidra l-possibilità li tuża' [//translatewiki.net/wiki/Main_Page?setlang=mt translatewiki.net], il-proġett MediaWiki għal-lokalizzazzjoni.",
+ "editinginterface": "'''Avviż:''' Qiegħed tagħmel modifiki lejn paġna li qiegħda tintuża biex tipprovdi interfaċċa għall-messaġġi tas-software. Kull modifika f'din il-paġna se taffetwa l-apparenza tal-faċċata tal-utenti kollha. Għat-traduzzjonijiet, ikkunsidra l-possibilità li tuża [//translatewiki.net/wiki/Main_Page?setlang=mt translatewiki.net], il-proġett MediaWiki għal-lokalizzazzjoni.",
"cascadeprotected": "Din il-paġna ġiet protetta mill-modifiki, minħabba li tinkludi {{PLURAL:$1|paġni, li huwa|paġni, li huma}} protetti bil-preferenza tal-\"kaskata\" mixewla:\n$2",
"namespaceprotected": "Inti m'għandhekx il-permess li timodifika paġni fin-''namespace'' '''$1''.",
"customcssprotected": "M'għandekx il-permessi neċessarji sabiex timmodifika din il-paġna tas-CSS, minħabba li għandha tqegħid personali ta' utent ieħor.",
"diff-multi-manyusers": "(Mhux qed {{PLURAL:$1|tintwera reviżjoni intermedja|jintwerew $1 reviżjonijit intermedji}} mingħand iktar minn $2 {{PLURAL:$2|utent|$2 utenti}})",
"searchresults": "Riżultat tat-tfittxija",
"searchresults-title": "Riżultati tat-tfittxija għal \"$1\"",
- "toomanymatches": "Ħafna tqabbil ġew ritornati, jekk jogħġbok prova inkjesta differenti",
"titlematches": "Titlu tal-paġna taqbel",
"textmatches": "It-test tal-paġni, jaqbel",
"notextmatches": "L-ebda test ta' paġna ma jaqbel",
"tooltip-preferences-save": "Salva l-preferenzi",
"tooltip-summary": "Daħħal taqsira żgħira",
"common.css": "/* CSS li tpoġġa hawnhekk irrid jiġi applikat fl-iskins kollha */",
- "monobook.css": "/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-iskin ''Monobook'' */",
"common.js": "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal kull utent f'kull tniżżil ta' paġna. */",
- "monobook.js": "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Monobook'' */",
"anonymous": "{{PLURAL:$1|Utent anonimu|Utenti anonimi}} ta' {{SITENAME}}",
"siteuser": "$1, utent tal-{{SITENAME}}",
"anonuser": "$1, utent anonimu ta' {{SITENAME}}",
"pageinfo-protect-cascading": "Protezzjoni li tintiret minn hawnhekk",
"pageinfo-protect-cascading-yes": "Iva",
"pageinfo-protect-cascading-from": "Protezzjoni li tintiret minn",
- "skinname-monobook": "Monobook",
"markaspatrolleddiff": "Marka l-modifiki bħalha verifikati",
"markaspatrolledtext": "Immarka din il-paġna bħala verifikata",
"markedaspatrolled": "Markat bħalha verifikat",
"qbmyoptions": "Монь лопан",
"faq": "Сеедьстэ кепедень кевкстемат",
"faqpage": "Project:Сеедьстэ кепедень кевкстемат",
- "vector-action-addsection": "Поладомс мезде кортамс",
- "vector-action-delete": "Нардамс",
- "vector-action-move": "Печтевтемс",
- "vector-action-protect": "Аравтомс ванстомас",
- "vector-action-undelete": "Вельмевтемс нардазенть",
- "vector-action-unprotect": "Полавтомс ванстоманзо",
- "vector-view-create": "Теемс-Шкамс",
- "vector-view-edit": "Витнемс-петнемс",
- "vector-view-history": "Ваномс юронзо-путовксонзо",
- "vector-view-view": "Ловномс",
- "vector-view-viewsource": "Ваномс косто саезь",
"actions": "Тев теемат",
"namespaces": "Лемпотмот",
"variants": "Вариантт",
"qbmyoptions": "Goá ê ia̍h",
"faq": "Būn-tah",
"faqpage": "Project:Būn-tah",
- "vector-action-addsection": "Ke chi̍t-ê toān-lo̍h",
- "vector-action-delete": "Thâi",
- "vector-action-move": "Sóa khì",
- "vector-action-protect": "Pó-hō·",
- "vector-action-undelete": "chhú-siau thâi tiàu",
- "vector-action-unprotect": "kái pó-hō·",
- "vector-view-create": "Khai-sí siá",
- "vector-view-edit": "Siu-kái",
- "vector-view-history": "khoàⁿ le̍k-sú",
- "vector-view-view": "Tha̍k",
- "vector-view-viewsource": "Khoàⁿ goân-sú lōe-iông",
"actions": "Tōng-chok",
"namespaces": "Miâ-khong-kan",
"variants": "piàn-thé",
"ok": "Hó ah",
"retrievedfrom": "Lâi-goân: \"$1\"",
"youhavenewmessages": "Lí ū $1 ($2).",
+ "youhavenewmessagesfromusers": "{{PLURAL:$3|个儂|$3个儂}}的$1 ($2)个通知。",
+ "youhavenewmessagesmanyusers": "有誠濟儂($2)予你 $1 个通知。",
+ "newmessageslinkplural": "{{PLURAL:$1|一个新通知|999=新通知}}",
+ "newmessagesdifflinkplural": "choè-kīn kái{{PLURAL:$1|pái|pái}}",
"youhavenewmessagesmulti": "Lí tī $1 ū sin sìn-sit",
"editsection": "siu-kái",
"editold": "siu-kái",
"nospecialpagetext": "<strong>Bô lí beh tih ê te̍k-sû-ia̍h。</strong>\n\n[[Special:SpecialPages|{{int:specialpages}}]] sī só͘-ū ê te̍k-sû-ia̍h lia̍t-pió.",
"error": "Chhò-gō·",
"databaseerror": "Chu-liāu-khò· chhò-gō·",
+ "databaseerror-text": "一个資料庫的查詢發生錯誤。\n這有可能是系統軟體臭蟲引起的。",
+ "databaseerror-textcl": "有一个資料庫的查詢錯誤。",
"databaseerror-query": "揣:$1",
"databaseerror-function": "功能:$1",
"databaseerror-error": "chhò-gō͘",
"badarticleerror": "Bē-tàng tiàm chit ia̍h chip-hêng chit ê tōng-chok.",
"cannotdelete": "Bô-hoat-tō· kā hit ê ia̍h a̍h-sī iáⁿ-siōng 「$1」 thâi tiāu. (Khó-lêng pa̍t-lâng í-keng kā thâi tiāu ah.)",
"cannotdelete-title": "無法度共\"$1\"這頁刣掉。",
+ "delete-hook-aborted": "有設定阻擋刣掉的動作。\n毋閣無其他的解說。",
+ "no-null-revision": "袂當予\"$1\"產生一个空的修訂本。",
"badtitle": "M̄-chiâⁿ piau-tê",
"badtitletext": "Iau-kiû ê piau-tê sī bô-hāu ê, khang ê, a̍h-sī liân-kiat chhò-gō· ê inter-language/inter-wiki piau-tê.",
- "perfcached": "Ē-kha ê chu-liāu tùi lâi--ê, só·-í bī-pit oân-choân hoán-èng siōng sin ê chōng-hóng. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
- "perfcachedts": "Ē-kha ê chu-liāu tùi lâi--ê, tī $1 keng-sin--koè. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+ "perfcached": "Ē-kha ê chu-liāu tùi lâi--ê, só·-í bô it-tēng sī siōng sin ê. Tī khoài-chhûn-khu siōng chē ē-tàng khǹg{{PLURAL:$1| pit|$1 pit}} chu-liāu.",
+ "perfcachedts": "Ē-kha ê chu-liāu tùi lâi--ê, tī $1 keng-sin--koè. Tī khoài-chûn-khu siōng chē ē-tàng khǹg {{PLURAL:$4|pit|$4 pit}} chu-liāu.",
"querypage-no-updates": "Chit-má bē-sái kái chit ia̍h.\nChia ê chu-liāu bē-tàng sui tiông-sin chéng-lí.",
"viewsource": "Khoàⁿ goân-sú lōe-iông",
+ "viewsource-title": "看 $1的原本編碼。",
"actionthrottled": "Tōng-chok hông tóng leh.",
"actionthrottledtext": "Ūi-tio̍h thê-hông lah-sap ê chhú-tì, lí ū hông hān-chè tī té sî-kan lāi chò siuⁿ chē pái chit ê tōng-chok, taⁿ lí í-keng chhiau-koè hān-chè.\nChhiáⁿ tī kúi hun-cheng hāu chiah koh chhì.",
- "protectedpagetext": "Chit ia̍h hông só tiâu leh, bē pian-chi̍p tit.",
+ "protectedpagetext": "Chit ia̍h hông só tiâu leh, bē pian-chi̍p tit, mā bē-tàng chò kî-thaⁿ oa̍h-tāng.",
"viewsourcetext": "Lí ē-sái khoàⁿ ia̍h khó͘-pih chit ia̍h ê goân-sú loē-iông:",
- "protectedinterface": "Chit ia̍h thê-kiong nńg-thé kài-bīn ēng ê bûn-jī. Ūi beh ī-hông lâng chau-that, só͘-í ū siū tio̍h pó-hō͘.",
- "editinginterface": "'''Sè-jī:''' Lí tng teh siu-kái 1 bīn thê-kiong nńg-thé kài-bīn bûn-jī ê ia̍h. Jīn-hô kái-piàn to ē éng-hióng tio̍h kî-thaⁿ iōng-chiá ê sú-iōng kài-bīn.",
+ "protectedinterface": "Chit ia̍h thê-kiong nńg-thé kài-bīn ēng ê bûn-jī. Ūi beh ī-hông lâng chau-that, só͘-í ū siū tio̍h pó-hō͘. Nā beh kái hoan-e̍k, chhiaⁿ khì Ûi-ki Mûi-thé chāi-tē-hoà sū-kang [//translatewiki.net/ translatewiki.net] hiâ.",
+ "editinginterface": "'''Sè-jī:''' Lí tng teh siu-kái 1 bīn thê-kiong nńg-thé kài-bīn bûn-jī ê ia̍h. Jīn-hô kái-piàn to ē éng-hióng tio̍h kî-thaⁿ iōng-chiá ê sú-iōng kài-bīn. Nā beh kái hoan-e̍k, chhiaⁿ khì Ûi-ki Mûi-thé chāi-tē-hoà sū-kang [//translatewiki.net/ translatewiki.net] hiâ.",
"cascadeprotected": "Chit-ê ia̍h í-keng hông pó-hō͘ bē kái tit. In-ūi i tī ē-bīn {{PLURAL:$1|ê|ê}} liân-só pó-hō͘ lāi-té:\n$2",
"namespaceprotected": "Lí bô khoân-lī kái '''$1''' miâ-khong-kan ê ia̍h",
"virus-unknownscanner": "M̄-chai siáⁿ pēⁿ-to̍k:",
- "logouttext": "'''Lí í-keng teng-chhut.'''\n\nLí ē-sái mài kì-miâ kè-siok sú-iōng {{SITENAME}}, mā ē-sái iōng kāng-ê a̍h-sī pa̍t-ê sin-hūn têng teng-ji̍p.\nChhiaⁿ chù-ì: ū-kóa ia̍h ū khó-lêng khoàⁿ-tio̍h bē-su lí iû-goân teng-ji̍p tiong; che chi-iàu piàⁿ tiāu lí ê browser ê cache chiū ē chèng-siông.",
+ "logouttext": "'''Lí í-keng teng-chhut.'''\nChhiaⁿ chù-ì: ū-kóa ia̍h ū khó-lêng khoàⁿ-tio̍h bē-su lí iáu teng-ji̍p tī leh; che chi-iàu piàⁿ tiāu liû-lám-khì ê khoài-chhú-khu, tiō ē chèng-siông.",
"welcomeuser": "Hoan-gêng, $1!",
"yourname": "Lí ê iōng-chiá miâ-chheng:",
"userlogin-yourname": "Iōng-chiá miâ-chheng",
"yourpassword": "Lí ê bi̍t-bé:",
"userlogin-yourpassword": "Bi̍t-bé",
"yourpasswordagain": "Têng phah bi̍t-bé:",
- "remembermypassword": "Kì tiâu góa ê bi̍t-bé (āu-chhiú teng-ji̍p iōng) (siōng chē kì $1 {{PLURAL:$1|kang|kang}})",
+ "remembermypassword": "Tī chit ê liû-lám-khì kì góa ê teng-ji̍p chu-liāu.(siōng chē kì $1 {{PLURAL:$1|kang|kang}})",
+ "password-change-forbidden": "佇這个維基,你袂當改密碼。",
+ "externaldberror": "這可能是資料庫驗證錯誤,抑是無允准你改外部的口座。",
"login": "Teng-ji̍p",
"nav-login-createaccount": "Teng-ji̍p / khui sin kháu-chō",
"loginprompt": "Thiⁿ ē-kha ê chu-liāu thang khui sin hō·-thâu a̍h-sī teng-ji̍p {{SITENAME}}.",
"logout": "Teng-chhut",
"userlogout": "Teng-chhut",
"notloggedin": "Bô teng-ji̍p",
+ "userlogin-noaccount": "敢無口座?",
+ "userlogin-joinproject": "加入 {{SITENAME}}",
"nologin": "Bô kháu-chō thang teng-ji̍p? $1",
"nologinlink": "Khui 1 ê kháu-chō",
"createaccount": "Khui sin kháu-chō",
"gotaccount": "Í-keng ū kháu-chō? '''$1'''.",
"gotaccountlink": "Teng-ji̍p",
- "createaccountmail": "Thàu koè tiān-chú-phoe",
+ "createaccountmail": "Iōng chi̍t-ê lîm-sî loān-sò͘ sán-seng ê bi̍t-bé , kià khì goá chí-tēng ê tiān-chú-phoe tē-chí.",
"createaccountreason": "Lí-iû:",
"badretype": "Lí su-ji̍p ê 2-cho· bi̍t-bé bô tùi.",
- "userexists": "Lí beh ti̍h ê iōng-chiá miâ-chheng í-keng ū lâng iōng. Chhiáⁿ kéng pa̍t-ê miâ.",
+ "userexists": "Lí phah ê iōng-chiá miâ-chheng í-keng ū lâng iōng. Chhiáⁿ lí iōng pa̍t-ê miâ.",
"loginerror": "Teng-ji̍p chhò-gō·",
"createaccounterror": "Bô hoat-tō͘ khui kháu-chō: $1",
"loginsuccesstitle": "Teng-ji̍p sêng-kong",
"loginsuccess": "Lí hiān-chhú-sî í-keng teng-ji̍p {{SITENAME}} chò \"$1\".",
- "nosuchuser": "Chia bô iōng-chiá hō-chò \"$1\". Chhiáⁿ kiám-cha lí ê phèng-im, a̍h-sī iōng ē-kha ê pió lâi khui sin iōng-chiá ê kháu-chō.",
+ "nosuchuser": "Chia bô iōng-chiá hō-chò \"$1\".\nIiōng-chiá hō-chò ū hun toā-jī sè-jī.\nChhiáⁿ kiám-cha lí ê phèng-im, a̍h-sī [[Special:UserLogin/signup|khui sin iōng-chiá ê kháu-chō.]]",
"nosuchusershort": "Bô \"$1\" chit ê iōng-chiá miâ.\nTùi khoàⁿ-māi, lí phah--ê.",
"nouserspecified": "Lí ài chí-tēng chi̍t ê iōng-chiá miâ.",
"wrongpassword": "Lí su-ji̍p ê bi̍t-bé ū têng-tâⁿ. Chhiáⁿ têng chhì.",
"noemail": "Kì-lo̍k bô iōng-chiá \"$1\" ê e-mail chū-chí.",
"passwordsent": "Ū kià sin bi̍t-bé khì \"$1\" chù-chheh ê e-mail chū-chí. Siu--tio̍h liáu-āu chhiáⁿ têng teng-ji̍p.",
"mailerror": "Kià phoe tú tio̍h chhò-gō·: $1",
- "acct_creation_throttle_hit": "Pháiⁿ-sè, lí taⁿ í-keng khui $1 ê kháu-chō ā. Bē-sái koh-chài khui.",
- "emailauthenticated": "Lí ê e-mail chū-chí tī $1 khak-jīn sêng-kong.",
+ "acct_creation_throttle_hit": "你這馬用的網路地址有佇最近一工開{{PLURAL:$1|1 个口座|$1 个口座}},這已經超過系統允准的數目。\n所以,這馬無法度予用這个網路地址的儂,閣開口座。",
+ "emailauthenticated": "Lí ê e-mail chū-chí tī $2 $3 khak-jīn sêng-kong.",
"emailnotauthenticated": "Lí ê e-mail chū-chí iáu-bōe khak-jīn ū-hāu, só·-í ē--kha ê e-mail kong-lêng bē-ēng-tit.",
"noemailprefs": "Tī lí ê siat-piān chí-tēng chi̍t ê tiān-chú-phoe tē-chí thang hō͘ chia ê kong-lêng ē-tàng ēng.",
"emailconfirmlink": "Chhiáⁿ khak-jīn lí ê e-mail chū-chí ū-hāu",
"passwordreset-username": "Lí ê iōng-chiá miâ-chheng:",
"passwordreset-email": "Tiān-chú-phoe tē-chí:",
"passwordreset-emailelement": "Iōng-chiá: $1\nLîm-sî ê bi̍t-bé: $2",
- "passwordreset-emailsent": "Chit hong thê-chhíⁿ ê tiān-chú-phoe í-keng kià chhut.",
+ "passwordreset-emailsent": "Têng siat bi̍t-bé ê tiān-chú-phoe í-keng kià chhut-khì ah.",
"changeemail": "Kái tiān-chú-phoe ê tē-chí",
"changeemail-oldemail": "Chit-má ê E-mail tē-chí:",
"changeemail-newemail": "Sin E-mail ê chū-chí:",
"loginreqlink": "Teng-ji̍p",
"loginreqpagetext": "Lí ài $1 chiah thang khoàⁿ pat ia̍h.",
"accmailtitle": "Bi̍t-bé kià chhut khì ah.",
- "accmailtext": "$1 ê bi̍t-bé í-keng kìa khì $2.",
+ "accmailtext": "Chi̍t ê iōng loān-sò͘ sán-seng ê bi̍t-bé, beh hō͘ [[User talk:$1|$1]] ê, í-keng kìa khì $2.",
"newarticle": "(Sin)",
"newarticletext": "Lí tòe 1 ê liân-kiat lâi kàu 1 bīn iáu-bōe chûn-chāi ê ia̍h. Beh khai-sí pian-chi̍p chit ia̍h, chhiáⁿ tī ē-kha ê bûn-jī keh-á lāi-té phah-jī. ([$1 Bo̍k-lio̍k] kà lí án-choáⁿ chìn-hêng.) Ká-sú lí bô-tiuⁿ-tî lâi kàu chia, ē-sai chhi̍h liû-lám-khì ê '''téng-1-ia̍h''' tńg--khì.",
"anontalkpagetext": "----''Pún thó-lūn-ia̍h bô kò·-tēng ê kháu-chō/hō·-thâu, kan-na ū 1 ê IP chū-chí (chhin-chhiūⁿ 123.456.789.123). In-ūi bô kāng lâng tī bô kāng sî-chūn ū khó-lêng tú-hó kong-ke kāng-ê IP, lâu tī chia ê oē ū khó-lêng hō· bô kāng lâng ê! Beh pī-bián chit khoán būn-tê, ē-sái khì [[Special:UserLogin|khui 1 ê hō·-thâu a̍h-sī teng-ji̍p]].''",
"shown-title": "Múi ia̍h hián-sī $1 {{PLURAL:$1|kiat-kó|kiat-kó}}",
"viewprevnext": "Khoàⁿ ($1 {{int:pipe-separator}} $2) ($3)",
"searchprofile-articles": "Loē-iông ia̍h",
- "searchprofile-project": "幫助佮事工的頁",
"searchprofile-images": "To-mûi-thé",
"searchprofile-everything": "Só͘-ū ê",
"searchprofile-advanced": "chìn-chi̍t-pō͘",
"searchprofile-articles-tooltip": "Tī $1 chhoé",
- "searchprofile-project-tooltip": "Tī $1 chhoé",
"searchprofile-images-tooltip": "Chhoé tóng-àn",
"searchprofile-everything-tooltip": "揣全部(包括討論頁)",
"searchprofile-advanced-tooltip": "佇你家己設的名空間內底揣",
"servertime": "Server sî-kan hiān-chāi sī",
"guesstimezone": "Tùi liû-lám-khì chhau--lâi",
"allowemail": "Ún-chún pa̍t-ê iōng-chiá kià email kòe-lâi",
- "defaultns": "Tī chiah ê miâ-khong-kan chhiau-chhōe:",
"prefs-files": "Tóng-àn",
"youremail": "Lí ê email:",
"yourrealname": "Lí ê chin miâ:",
"qbmyoptions": "Egne innstillinger",
"faq": "Ofte stilte spørsmål",
"faqpage": "Project:Ofte stilte spørsmål",
- "vector-action-addsection": "Nytt emne",
- "vector-action-delete": "Slett",
- "vector-action-move": "Flytt",
- "vector-action-protect": "Beskytt",
- "vector-action-undelete": "Gjenopprett",
- "vector-action-unprotect": "Endre beskyttelse",
- "vector-view-create": "Opprett",
- "vector-view-edit": "Rediger",
- "vector-view-history": "Vis historikk",
- "vector-view-view": "Les",
- "vector-view-viewsource": "Vis kilden",
"actions": "Handlinger",
- "vector-more-actions": "Mer",
"namespaces": "Navnerom",
"variants": "Varianter",
"navigation-heading": "Navigasjonsmeny",
"editwarning-warning": "Ved å forlate siden kan du miste alle endringer du har gjort.\nHvis du er innlogget, kan du slå av denne advarselen under \"{{int:prefs-editing}}\"-avsnittet i dine innstillinger.",
"editpage-notsupportedcontentformat-title": "Innholdsformatet er ikke støttet",
"editpage-notsupportedcontentformat-text": "Innholdsformatet $1 er ikke støttet av innholdsmodellen $2.",
- "content-model-wikitext": "WikiTekst",
+ "content-model-wikitext": "wikitekst",
"content-model-text": "Ren tekst",
"content-model-javascript": "JavaScript",
"content-model-css": "CSS",
"node-count-exceeded-category": "Sider hvor antallet noder er overskredet",
"node-count-exceeded-category-desc": "En kategori for sider der antallet noder er overskredet.",
"node-count-exceeded-warning": "Siden har overskredet antallet noder",
- "expansion-depth-exceeded-category": "Sider hvor hvor ekspansjonsdybden er overskredet",
+ "expansion-depth-exceeded-category": "Sider hvor ekspansjonsdybden er overskredet",
"expansion-depth-exceeded-category-desc": "Dette er en kategori for sider hvor ekspansjonsdybden er overskredet.",
"expansion-depth-exceeded-warning": "Sida har overskredet ekspansjonsdybden",
"parser-unstrip-loop-warning": "«Unstrip»-loop påvist",
"currentrev": "Nåværende versjon",
"currentrev-asof": "Nåværende revisjon fra $1",
"revisionasof": "Revisjonen fra $1",
- "revision-info": "Revisjon per $1 av $2",
+ "revision-info": "Revisjon per $1 av {{GENDER:$6|$2}}$7",
"previousrevision": "← Eldre revisjon",
"nextrevision": "Nyere revisjon →",
"currentrevisionlink": "Nåværende revisjon",
"difference-missing-revision": "{{PLURAL:$2|En revisjon|$2 revisjoner}} av denne forskjellen ($1) {{PLURAL:$2|ble|ble}} ikke funnet.\n\nDette skyldes som regel at en gammel forskjell-lenke er fulgt til en side som er slettet.\nDetaljer kan finnes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].",
"searchresults": "Søkeresultater",
"searchresults-title": "Søkeresultater for «$1»",
- "toomanymatches": "For mange mulige svar, prøv med en annen spørring",
"titlematches": "Artikkeltitler med treff på forespørselen",
"textmatches": "Artikkeltekster med treff på forespørselen",
"notextmatches": "Inden sidetekst samsvarte med søket",
"powersearch-togglelabel": "Merk:",
"powersearch-toggleall": "Alle",
"powersearch-togglenone": "Ingen",
+ "powersearch-remember": "Husk valgene for fremtidige søk",
"search-external": "Eksternt søk",
"searchdisabled": "Søkefunksjonen er slått av. Du kan søke via Google i mellomtiden. Merk at Googles indeksering av {{SITENAME}} muligens er utdatert.",
"search-error": "En feil oppsto under søk: $1",
"largefileserver": "Denne filen er større enn det tjeneren er satt opp til å tillate.",
"emptyfile": "Filen du lastet opp ser ut til å være tom. Dette kan komme av en skrivefeil i filnavnet. Sjekk om du virkelig vil laste opp denne filen.",
"windows-nonascii-filename": "Denne wikien støtter ikke filnavn med spesialtegn.",
- "fileexists": "Ei fil med dette navnet finnes allerede.\nSjekk <strong>[[:$1]]</strong> hvis du ikke er sikker på at du vil forandre den.\n[[$1|thumb]]",
+ "fileexists": "En fil med dette navnet finnes allerede.\nSjekk <strong>[[:$1]]</strong> hvis {{GENDER:|du}} ikke er sikker på at du vil forandre den.\n[[$1|thumb]]",
"filepageexists": "Beskrivelsessiden for denne filen finnes allerede på <strong>[[:$1]]</strong>, men ingen filer med dette navnet finnes. Sammendraget du skriver inn vil ikke vises på beskrivelsessiden. For at det skal dukke opp der må du skrive det inn manuelt etter å ha lastet opp filen.\n[[$1|thumb]]",
- "fileexists-extension": "En fil med et lignende navn finnes: [[$2|thumb]]\n* Navnet på din fil: <strong>[[:$1]]</strong>\n* Navn på eksisterende fil: <strong>[[:$2]]</strong>\nVelg et annet filnavn.",
+ "fileexists-extension": "En fil med et lignende navn finnes: [[$2|thumb]]\n* Navnet på din fil: <strong>[[:$1]]</strong>\n* Navn på eksisterende fil: <strong>[[:$2]]</strong>\nØnsker du å bruke et mer særegent filnavn?",
"fileexists-thumbnail-yes": "Filen ser ut til å være et bilde av redusert størrelse. [[$1|thumb]]\nVennligst sjekk filen <strong>[[:$1]]</strong>.\nOm filen du sjekket er det samme bildet, men i opprinnelig størrelse, er det ikke nødvendig å laste opp en ekstra fil.",
"file-thumbnail-no": "Filnavnet begynner med <strong>$1</strong>.\nDet virker som om det er et bilde av redusert størrelse ''(miniatyrbilde)''.\nOm du har dette bildet i stor utgave, last opp det, eller endre filnavnet på denne filen.",
"fileexists-forbidden": "En fil med dette navnet finnes fra før, og kan ikke erstattes.\nOm du fortsatt ønsker å laste opp filen, gå tilbake og last den opp under et nytt navn. [[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "Sletting og gjenoppretting av filer er midlertidig slått av på grunn av vedlikehold.",
"filedelete-maintenance-title": "Kan ikke slette fil",
"mimesearch": "MIME-søk",
- "mimesearch-summary": "Denne siden muliggjør filtrering av filer per MIME-type. Skriv inn: innholdstype/undertype, for eksempel <code>image/jpeg</code>.",
+ "mimesearch-summary": "Denne siden muliggjør filtrering av filer per MIME-type. Skriv inn: innholdstype/undertype eller innholdstype/*, for eksempel <code>image/jpeg</code>.",
"mimetype": "MIME-type:",
"download": "last ned",
"unwatchedpages": "Sider som ikke er overvåket",
"tooltip-summary": "Skriv et kort sammendrag",
"interlanguage-link-title": "$1 – $2",
"common.css": "/* CSS plassert i denne fila vil gjelde for alle utseender. */",
- "monobook.css": "/* CSS i denne fila vil gjelde alle som bruker drakta Monobook */",
"common.js": "/* Javascript i denne fila vil gjelde for alle drakter. */",
- "monobook.js": "/* Javascript i denne fila vil gjelde for brukere av drakta Monobook */",
"anonymous": "{{PLURAL:$1|Anonym bruker|Anonyme brukere}} av {{SITENAME}}",
"siteuser": "{{SITENAME}}-bruker $1",
"anonuser": "{{SITENAME}}s anonyme bruker $1",
"pageinfo-category-pages": "Antall sider",
"pageinfo-category-subcats": "Antall underkategorier",
"pageinfo-category-files": "Antall filer",
- "skinname-monobook": "Monobook",
"markaspatrolleddiff": "Merk som patruljert",
"markaspatrolledtext": "Merk denne siden som patruljert",
"markedaspatrolled": "Merket som patruljert",
"qbmyoptions": "Veurkeuren",
"faq": "Vragen die vake esteld wörden",
"faqpage": "Project:Vragen die vake esteld wörden",
- "vector-action-addsection": "Niej onderwarp",
- "vector-action-delete": "Vortdoon",
- "vector-action-move": "Herneumen",
- "vector-action-protect": "Beveiligen",
- "vector-action-undelete": "Weerummeplaotsen",
- "vector-action-unprotect": "Beveiliging wiezigen",
- "vector-view-create": "Anmaken",
- "vector-view-edit": "Bewarken",
- "vector-view-history": "Geschiedenisse bekieken",
- "vector-view-view": "Lezen",
- "vector-view-viewsource": "Brontekste bekieken",
"actions": "Haandeling",
- "vector-more-actions": "Meer",
"namespaces": "Naamruumtes",
"variants": "Variaanten",
"navigation-heading": "Navigasiemenu",
"difference-missing-revision": "{{PLURAL:$2|Eén versie|$2 versies}} van disse verschillen ($1) {{PLURAL:$2|is|bin}} niet evunnen.\n\nDit kömp meestentieds deur t volgen van n verouwerde verwiezing naor n zied die vortedaon is.\nWaorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} vortdologboek].",
"searchresults": "Zeukresultaoten",
"searchresults-title": "Zeukresultaoten veur \"$1\"",
- "toomanymatches": "Der waren te veule resultaoten. Probeer n aandere zeukopdrachte.",
"titlematches": "Overeenkomst mit t onderwarp",
"textmatches": "Overeenkomst mit teksten",
"notextmatches": "Gien overeenstemming",
"pageinfo-category-pages": "Antal ziejen",
"pageinfo-category-subcats": "Antal onderkategorieën",
"pageinfo-category-files": "Antal bestaanden",
- "skinname-monobook": "Monobook",
"markaspatrolleddiff": "Zet op nao-ekeken",
"markaspatrolledtext": "Disse zied is op nao-ekeken ezet",
"markedaspatrolled": "Op nao-ekeken ezet",
"weeks": "{{PLURAL:$1|één weke|$1 weken}}",
"months": "{{PLURAL:$1|een maond|$1 maonden}}",
"years": "{{PLURAL:$1|één jaor|$1 jaor}}",
- "ago": "$1 eleen",
+ "ago": "$1 elejen",
"just-now": "onderlest",
"hours-ago": "$1 {{PLURAL:$1|uur}} elejen",
"minutes-ago": "$1 {{PLURAL:$1|minuut|minuten}} elejen",
"diff-multi-manyusers": "({{PLURAL:$1|Een Twischenversion|$1 Twischenversionen}} von mehr as $2 {{PLURAL:$2|Bruker|Brukers}} warrt nich wiest)",
"searchresults": "Söökresultaten",
"searchresults-title": "Söökresultaten för „$1“",
- "toomanymatches": "To veel Sieden funnen för de Söök, versöök en annere Affraag.",
"titlematches": "Övereenstimmen mit Överschriften",
"textmatches": "Övereenstimmen mit Texten",
"notextmatches": "Kene Övereenstimmen",
"qbmyoptions": "मेरो पेज",
"faq": "धैरै सोधिएका प्रश्नहरु",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "विषय थप्नुहोस",
- "vector-action-delete": "हटाउने",
- "vector-action-move": "सार्ने",
- "vector-action-protect": "सुरक्षित गर्ने",
- "vector-action-undelete": "हटाएको रद्द गर्ने",
- "vector-action-unprotect": "सुरक्षा परिवर्तन गर्ने",
- "vector-view-create": "सृजना गर्ने",
- "vector-view-edit": "सम्पादन",
- "vector-view-history": "इतिहास हेर्ने",
- "vector-view-view": "पढ्ने",
- "vector-view-viewsource": "स्रोत हेर्ने",
"actions": "कार्यहरु",
"namespaces": "नेमस्पेस",
"variants": "बहुरुपहरु",
"diff-multi-manyusers": "($2 {{PLURAL:$2|भन्दा अधिक प्रयोगकर्ता|भन्दा अधिक प्रयोगकर्ताहरु}}द्वारा {{PLURAL:$1|एउटा मध्यवर्ती संशोधन|$1 मध्यवर्ती संशोधनहरु}} नदेखाइएको)",
"searchresults": "खोज नतिजाहरू",
"searchresults-title": " \"$1\"को लागि खोज नतिजाहरु",
- "toomanymatches": "अति धेरै मिल्ने नतिजाहरु भेटियो , कृपया फरक क्वेरी प्रयोग गर्नुहोस",
"titlematches": "पृष्ठ शिर्षक मिल्छ",
"textmatches": "पृष्ठ पाठ मिल्छ",
"notextmatches": "अक्षरस् पेज भेटिएन",
"tooltip-preferences-save": "अभिरुचिहरु संग्रह गर्नुहोस्",
"tooltip-summary": "छोटो सारांश हाल्नुहोस्",
"common.css": "/* यहाँ राखिएका CSS सबै खोलहरुमा लागु हुनेछन् */",
- "monobook.css": "/* यहाँ राखिएको CSS ले मोनोबुक स्किनको प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ */",
- "vector.css": "/* यहाँ राखिएको CSS ले भेक्टर स्किनको प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ */",
"print.css": "/* यहाँ राखिएको CSS मुद्रण नतिजालाई प्रभावित गर्छ */",
"anonymous": "{{SITENAME}} का {{PLURAL:$1||}} नाम नभएका सदस्य",
"siteuser": "{{SITENAME}} प्रयोगकर्ता $1",
"pageinfo-category-pages": "पृष्ठहरूको संख्या",
"pageinfo-category-subcats": "उपश्रेणीहरूको संख्या",
"pageinfo-category-files": "फाइलहरूको संख्या",
- "skinname-monobook": "मोनोबुक",
- "skinname-vector": "भेक्टर",
"markaspatrolleddiff": "गस्ती गरिएको(patrolled) को रुपमा चिनो लगाउने",
"markaspatrolledtext": "यस पृष्ठलाई गस्ती गरिएको(patrolled) को रुपमा चिनो लगाउने",
"markedaspatrolled": "गस्ती गरिएको(patrolled) को रुपमा चिनो लगाइयो",
"qbmyoptions": "Mijn pagina's",
"faq": "Veelgestelde vragen",
"faqpage": "Project:Veelgestelde vragen",
- "vector-action-addsection": "Kopje toevoegen",
- "vector-action-delete": "Verwijderen",
- "vector-action-move": "Hernoemen",
- "vector-action-protect": "Beveiligen",
- "vector-action-undelete": "Terugplaatsen",
- "vector-action-unprotect": "Beveiliging wijzigen",
- "vector-view-create": "Aanmaken",
- "vector-view-edit": "Bewerken",
- "vector-view-history": "Geschiedenis weergeven",
- "vector-view-view": "Lezen",
- "vector-view-viewsource": "Brontekst bekijken",
"actions": "Acties",
- "vector-more-actions": "Meer",
"namespaces": "Naamruimten",
"variants": "Varianten",
"navigation-heading": "Navigatiemenu",
"currentrev": "Huidige versie",
"currentrev-asof": "Huidige versie van $2 om $3",
"revisionasof": "Versie van $2 om $3",
- "revision-info": "Versie door $2 op $4 om $5",
+ "revision-info": "Versie door {{GENDER:$6|$2}} op $4 om $5 $7",
"previousrevision": "← Oudere versie",
"nextrevision": "Nieuwere versie →",
"currentrevisionlink": "Huidige versie",
"difference-missing-revision": "{{PLURAL:$2|Eén versie|$2 versies}} van deze verschillen ($1) {{PLURAL:$2|is|zijn}} niet aangetroffen.\n\nDit wordt meestal veroorzaakt door het volgen van een verouderde koppeling verschillen voor een pagina die is verwijderd.\nMeer gegevens zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
"searchresults": "Zoekresultaten",
"searchresults-title": "Zoekresultaten voor \"$1\"",
- "toomanymatches": "Er waren te veel resultaten.\nProbeer een andere zoekopdracht.",
"titlematches": "Overeenkomst met onderwerp",
"textmatches": "Overeenkomst met inhoud",
"notextmatches": "Geen pagina's gevonden",
"recentchanges-label-unpatrolled": "Deze bewerking is nog niet gecontroleerd",
"recentchanges-label-plusminus": "Deze paginagrootte is met dit aantal bytes gewijzigd",
"recentchanges-legend-heading": "'''Legenda:'''",
- "recentchanges-legend-newpage": "Zie ook de [[Special:NewPages|Lijst met nieuwe pagina's]].",
+ "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zie ook de [[Special:NewPages|Lijst met nieuwe pagina's]])",
"recentchanges-legend-plusminus": "(''±123'')",
"rcnotefrom": "Wijzigingen sinds <strong>$3 om $4</strong> (maximaal <strong>$1</strong> {{PLURAL:$1|wijziging|wijzigingen}}).",
"rclistfrom": "Wijzigingen bekijken vanaf $3 $2",
"windows-nonascii-filename": "Deze wiki ondersteunt geen bestandsnamen met speciale tekens.",
"fileexists": "Er bestaat al een bestand met deze naam.\nControleer <strong>[[:$1]]</strong> als u niet zeker weet of u het huidige bestand wilt overschrijven.\n[[$1|thumb]]",
"filepageexists": "De beschrijvingspagina voor dit bestand bestaat al op <strong>[[:$1]]</strong>, maar er bestaat geen bestand met deze naam.\nDe samenvatting die u hebt opgegeven verschijnt niet op de beschrijvingspagina.\nBewerk de pagina handmatig om uw beschrijving daar weer te geven.\n[[$1|miniatuur]]",
- "fileexists-extension": "Een bestand met dezelfde naam bestaat al: [[$2|thumb]]\n* Naam van het geüploade bestand: <strong>[[:$1]]</strong>\n* Naam van het bestaande bestand: <strong>[[:$2]]</strong>\nKies een andere naam.",
+ "fileexists-extension": "Een bestand met dezelfde naam bestaat al: [[$2|thumb]]\n* Naam van het geüploade bestand: <strong>[[:$1]]</strong>\n* Naam van het bestaande bestand: <strong>[[:$2]]</strong>\nWilt u misschien een meer onderscheidende naam gebruiken?",
"fileexists-thumbnail-yes": "Het bestand lijkt een verkleinde versie te zijn ''(miniatuurafbeelding)''. [[$1|thumb]]\nControleer het bestand <strong>[[:$1]]</strong>.\nAls het gecontroleerde bestand dezelfde afbeelding van oorspronkelijke grootte is, is het niet noodzakelijk een extra miniatuurafbeelding te uploaden.",
"file-thumbnail-no": "De bestandsnaam begint met <strong>$1</strong>.\nHet lijkt een verkleinde afbeelding te zijn ''(miniatuurafbeelding)''.\nAls u deze afbeelding in volledige resolutie hebt, upload die afbeelding dan.\nWijzig anders de bestandsnaam.",
"fileexists-forbidden": "Er bestaat al een bestand met deze naam, en dat kan niet overschreven worden.\nUpload uw bestand onder een andere naam.\n[[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "Het verwijderen en terugplaatsen is tijdelijk niet mogelijk wegens onderhoudswerkzaamheden.",
"filedelete-maintenance-title": "Bestand verwijderen is niet mogelijk",
"mimesearch": "Zoeken op MIME-type",
- "mimesearch-summary": "Deze pagina maakt het filteren van bestanden voor het MIME-type mogelijk.\nInvoer: inhoudstype/subtype, bijvoorbeeld <code>image/jpeg</code>.",
+ "mimesearch-summary": "Deze pagina maakt het filteren van bestanden voor het MIME-type mogelijk.\nInvoer: inhoudstype/subtype of inhoudstype/*, bijvoorbeeld <code>image/jpeg</code>.",
"mimetype": "MIME-type:",
"download": "downloaden",
"unwatchedpages": "Pagina's die niet op een volglijst staan",
"tooltip-summary": "Voer een korte samenvatting in",
"interlanguage-link-title": "$1 – $2",
"common.css": "/** CSS die hier wordt geplaatst heeft invloed op alle skins */",
- "monobook.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Monobook */",
- "vector.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Vector */",
"print.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op de printuitvoer */",
"noscript.css": "/ * CSS die hier wordt geplaatst heeft invloed voor gebruikers die JavaScript hebben uitgeschakeld * /",
"group-autoconfirmed.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op automatisch bevestigde gebruikers */",
"group-sysop.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op beheerders */",
"group-bureaucrat.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op bureaucraten */",
"common.js": "/* JavaScript die hier wordt geplaatst heeft invloed op alle pagina's voor alle gebruikers */",
- "monobook.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Monobook gebruiken */",
- "vector.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Vector gebruiken */",
"group-autoconfirmed.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op automatisch bevestigde gebruikers */",
"group-user.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op geregistreerde gebruikers */",
"group-bot.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op robots */",
"pageinfo-category-pages": "Aantal pagina's",
"pageinfo-category-subcats": "Aantal subcategorieën",
"pageinfo-category-files": "Aantal bestanden",
- "skinname-monobook": "Monobook",
- "skinname-vector": "Vector",
"markaspatrolleddiff": "Als gecontroleerd markeren",
"markaspatrolledtext": "Deze pagina als gecontroleerd markeren",
"markedaspatrolled": "Gemarkeerd als gecontroleerd",
"qbmyoptions": "Sidene mine",
"faq": "OSS",
"faqpage": "Project:OSS",
- "vector-action-addsection": "Nytt emne",
- "vector-action-delete": "Slett",
- "vector-action-move": "Flytt",
- "vector-action-protect": "Vern",
- "vector-action-undelete": "Gjenopprett",
- "vector-action-unprotect": "Endra vern",
- "vector-view-create": "Opprett",
- "vector-view-edit": "Endre",
- "vector-view-history": "Sjå historikken",
- "vector-view-view": "Les",
- "vector-view-viewsource": "Sjå kjelda",
"actions": "Handlingar",
"namespaces": "Namnerom",
"variants": "Variantar",
"permalink": "Fast lenkje",
"print": "Skriv ut",
"view": "Sjå",
+ "view-foreign": "Vis på $1",
"edit": "Endre",
+ "edit-local": "Endre lokal skildring",
"create": "Opprett",
+ "create-local": "Legg til lokal skildring",
"editthispage": "Endre sida",
"create-this-page": "Opprett sida",
"delete": "Slett",
"difference-missing-revision": "{{PLURAL:$2|Éin versjon|$2 versjonar}} av skilnaden ($1) vart ikkje {{PLURAL:$2|funnen|funne}}.\n\nDette skriv seg som oftast frå at ein har fylgt ei forelda versjonslenkje til ei side som er sletta.\nDetaljar kan ein finna i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].",
"searchresults": "Søkjeresultat",
"searchresults-title": "Søkjeresultat for «$1»",
- "toomanymatches": "Søket gav for mange treff, prøv ei anna spørjing",
"titlematches": "Sidetitlar med treff på førespurnaden",
"textmatches": "Sider med treff på førespurnaden",
"notextmatches": "Ingen sider hadde treff på førespurnaden",
"filehist-deleteall": "slett alle",
"filehist-deleteone": "slett",
"filehist-revert": "rulla attende",
- "filehist-current": "noverande",
+ "filehist-current": "gjeldande",
"filehist-datetime": "Dato/klokkeslett",
"filehist-thumb": "Miniatyrbilete",
"filehist-thumbtext": "Miniatyrbilete av versjonen frå $1",
"tooltip-preferences-save": "Lagra innstillingar",
"tooltip-summary": "Skriv inn eit kort samandrag",
"common.css": "/* CSS plassert i denne fila vil gjelde for alle utsjånader. */",
- "monobook.css": "/* CSS-tekst som vert plassert her, endrar utsjånaden til sidedrakta Monobook */",
"print.css": "/* CSS i denne fila vil påverke utskriftsversjonen */",
"common.js": "/* Javascript i denne fila vil gjelde for alle drakter. */",
- "monobook.js": "/* Javascript i denne fila vil gjelde for brukarar av drakta Monobook */",
"anonymous": "{{PLURAL:$1|anonym brukar|anonyme brukarar}} av {{SITENAME}}",
"siteuser": "{{SITENAME}}-brukaren $1",
"anonuser": "{{SITENAME}} anonym brukar $1",
"pageinfo-category-pages": "Tal sider",
"pageinfo-category-subcats": "Tal underkategoriar",
"pageinfo-category-files": "Tal filer",
- "skinname-monobook": "MonoBook",
"markaspatrolleddiff": "Merk som patruljert",
"markaspatrolledtext": "Merk innhaldssida som patruljert",
"markedaspatrolled": "Merk som patruljert",
"qbmyoptions": "Mas opcions",
"faq": "FAQ",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Apondre un subjècte",
- "vector-action-delete": "Suprimir",
- "vector-action-move": "Tornar nomenar",
- "vector-action-protect": "Protegir",
- "vector-action-undelete": "Restablir",
- "vector-action-unprotect": "Suprimir la proteccion",
- "vector-view-create": "Crear",
- "vector-view-edit": "Modificar",
- "vector-view-history": "Veire l'istoric",
- "vector-view-view": "Legir",
- "vector-view-viewsource": "Veire la font",
"actions": "Accions",
"namespaces": "Espacis de noms",
"variants": "Variantas",
"difference-missing-revision": "{{PLURAL:$2|Una revision|$2 revisions}} d'aquesta diferéncia ($1) {{PLURAL:$2|es pas estada trobada|son pas estadas trobadas}}.\n\nAquò se produtz en general en seguent un ligam de diferéncia obsolèta cap a una pagina qu'es estada suprimada.\nPodètz trobar de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de las supressions].",
"searchresults": "Resultats de la recèrca",
"searchresults-title": "Resultats de la recèrca per « $1 »",
- "toomanymatches": "Tròp d’ocuréncias son estadas trobadas, sètz pregat de sometre una requèsta diferenta.",
"titlematches": "Correspondéncias dins los títols d'articles",
"textmatches": "Correspondéncias dins los tèxtes d'articles",
"notextmatches": "Cap de tèxte d'article correspond pas a la recèrca",
"tooltip-preferences-save": "Salvar las preferéncias",
"tooltip-summary": "Apondètz un brèu resumit",
"common.css": "/** Lo CSS plaçat aicí serà aplicat a totas las aparéncias. */",
- "monobook.css": "/* Lo CSS plaçat aicí afectarà los utilizaires del skin Monobook */",
- "vector.css": "/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Vector */",
"print.css": "/* Lo CSS plaçat aicí afectarà las impressions */",
"common.js": "/* Tot JavaScript serà cargat amb cada pagina accedida per un utilizaire quin que siá. */",
- "monobook.js": "/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge MonoBook unicament. */",
- "vector.js": "/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Vector unicament. */",
"anonymous": "{{PLURAL:$1|Utilizaire anonim|Utilizaires anonims}} de {{SITENAME}}",
"siteuser": "Utilizaire $1 de {{SITENAME}}",
"anonuser": "l'utilizaire anonim $1 de {{SITENAME}}",
"pageinfo-category-pages": "Nombre de paginas",
"pageinfo-category-subcats": "Nombre de soscategorias",
"pageinfo-category-files": "Nombre de fichièrs",
- "skinname-monobook": "Monobook",
"markaspatrolleddiff": "Marcar coma essent pas un vandalisme",
"markaspatrolledtext": "Marcar aqueste article coma pas vandalizat",
"markedaspatrolled": "Marcat coma pas vandalizat",
"qbmyoptions": "Moje strony",
"faq": "FAQ",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Dodaj temat",
- "vector-action-delete": "Usuń",
- "vector-action-move": "Przenieś",
- "vector-action-protect": "Zabezpiecz",
- "vector-action-undelete": "Odtwórz",
- "vector-action-unprotect": "Zmień zabezpieczenie",
- "vector-view-create": "Utwórz",
- "vector-view-edit": "Edytuj",
- "vector-view-history": "Wyświetl historię",
- "vector-view-view": "Czytaj",
- "vector-view-viewsource": "Tekst źródłowy",
"actions": "Działania",
- "vector-more-actions": "Więcej",
"namespaces": "Przestrzenie nazw",
"variants": "Warianty",
"navigation-heading": "Menu nawigacyjne",
"difference-missing-revision": "{{PLURAL:$2|Wersja|$2 wersje|$2 wersji}} #$1 strony \"{{PAGENAME}}\" nie {{PLURAL:$2|została znaleziona|zostały znalezione|zostało znalezionych}}.\n\nZazwyczaj jest to spowodowane przestarzałym linkiem do usuniętej strony. Powód usunięcia znajduje się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze].",
"searchresults": "Wyniki wyszukiwania",
"searchresults-title": "Wyniki wyszukiwania „$1”",
- "toomanymatches": "Zbyt wiele elementów pasujących do wzorca, spróbuj innego zapytania",
"titlematches": "Znaleziono w tytułach",
"textmatches": "Znaleziono w treści stron",
"notextmatches": "Nie znaleziono w treści stron",
"largefileserver": "Plik jest większy niż maksymalny dozwolony rozmiar.",
"emptyfile": "Przesłany plik wydaje się być pusty. Może być to spowodowane literówką w nazwie pliku.\nSprawdź, czy nazwa jest prawidłowa.",
"windows-nonascii-filename": "Na tej wiki nie można używać znaków specjalnych w nazwach plików.",
- "fileexists": "Plik o takiej nazwie już istnieje.\nSprawdź <strong>[[:$1]]</strong>, jeśli nie jesteś pewien czy chcesz go zastąpić.\n[[$1|thumb]]",
+ "fileexists": "Plik o takiej nazwie już istnieje.\nSprawdź <strong>[[:$1]]</strong>, jeśli nie jesteś {{GENDER:|pewien|pewna}} czy chcesz go zastąpić.\n[[$1|thumb]]",
"filepageexists": "Istnieje już strona opisu tego pliku, została utworzona <strong>[[:$1]]</strong>, ale brak jest pliku o tej nazwie.\nInformacje, które wprowadzasz o przesyłanym pliku, nie pojawią się na jego stronie opisu.\nJeśli chcesz, by się tam pojawiły, musisz później, ręcznie przeredagować stronę opisu.\n[[$1|thumb]]",
- "fileexists-extension": "Plik o podobnej nazwie już istnieje: [[$2|thumb]]\n* Nazwa przesyłanego pliku: <strong>[[:$1]]</strong>\n* Nazwa istniejącego pliku: <strong>[[:$2]]</strong>\nWybierz inną nazwę.",
+ "fileexists-extension": "Plik o podobnej nazwie już istnieje: [[$2|thumb]]\n* Nazwa przesyłanego pliku: <strong>[[:$1]]</strong>\n* Nazwa istniejącego pliku: <strong>[[:$2]]</strong>\nMoże chcesz użyć bardziej zróżnicowanej nazwy?",
"fileexists-thumbnail-yes": "Plik wydaje się być pomniejszoną grafiką ''(miniaturką)''. [[$1|thumb]]\nSprawdź plik <strong>[[:$1]]</strong>.\nJeśli wybrany plik jest tą samą grafiką co ta w rozmiarze pierwotnym, nie musisz przesyłać dodatkowej miniaturki.",
"file-thumbnail-no": "Nazwa pliku zaczyna się od <strong>$1</strong>.\nWydaje się, że jest to pomniejszona grafika ''(miniaturka)''.\nJeśli posiadasz tę grafikę w pełnym rozmiarze – prześlij ją. Jeśli chcesz wysłać tę – zmień nazwę przesyłanego obecnie pliku.",
"fileexists-forbidden": "Plik o tej nazwie już istnieje i nie może zostać nadpisany.\nJeśli chcesz przesłać plik cofnij się i prześlij go pod inną nazwą. [[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "Usuwanie i odtwarzanie plików zostało tymczasowo wyłączone z powodu konserwacji.",
"filedelete-maintenance-title": "Nie można usunąć pliku",
"mimesearch": "Wyszukiwanie MIME",
- "mimesearch-summary": "Ta strona umożliwia wyszukiwanie plików ze względu na ich typ MIME.\nUżycie: typ_treści/podtyp, np. <code>image/jpeg</code>.",
+ "mimesearch-summary": "Ta strona umożliwia wyszukiwanie plików ze względu na ich typ MIME.\nUżycie: typ_treści/podtyp albo typ_treści/*, np. <code>image/jpeg</code>.",
"mimetype": "Typ MIME",
"download": "pobierz",
"unwatchedpages": "Nieobserwowane strony",
"wantedtemplates": "Potrzebne szablony",
"mostlinked": "Najczęściej linkowane strony",
"mostlinkedcategories": "Kategorie o największej liczbie stron",
- "mostlinkedtemplates": "Najczęściej linkowane szablony",
+ "mostlinkedtemplates": "Najczęściej transkludowane strony",
"mostcategories": "Strony z największą liczbą kategorii",
"mostimages": "Najczęściej linkowane pliki",
"mostinterwikis": "Strony z największą liczbą linków interwiki",
"tooltip-summary": "Wpisz krótki opis",
"interlanguage-link-title": "$1 – $2",
"common.css": "/* Umieszczony tutaj kod CSS zostanie zastosowany we wszystkich skórkach */",
- "monobook.css": "/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Książka */",
- "vector.css": "/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Wektor */",
"print.css": "/* Umieszczony tutaj kod CSS wpłynie na wygląd wydruku */",
"noscript.css": "/* Umieszczony tu arkusz stylów CSS będzie wykorzystywany dla użytkowników z wyłączoną obsługą JavaScript */",
"group-autoconfirmed.css": "/* CSS tutaj umieszczony będzie dotyczyć tylko automatycznie zatwierdzonych użytkowników */",
"group-sysop.css": "/* Umieszczony tutaj kod CSS dotyczyć będzie tylko administratorów */",
"group-bureaucrat.css": "/* Umieszczony tutaj kod CSS dotyczyć będzie tylko biurokratów */",
"common.js": "/* Umieszczony tutaj kod JavaScript zostanie załadowany przez każdego użytkownika, podczas każdego ładowania strony. */",
- "monobook.js": "/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Książka */",
- "vector.js": "/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Wektor */",
"anonymous": "{{PLURAL:$1|Anonimowy użytkownik|Anonimowi użytkownicy}} {{GRAMMAR:D.lp|{{SITENAME}}}}",
"siteuser": "{{GENDER:$2|użytkownik|użytkowniczka}} {{GRAMMAR:D.lp|{{SITENAME}}}} – $1",
"anonuser": "niezalogowany użytkownik {{GRAMMAR:D.lp|{{SITENAME}}}} – $1",
"pageinfo-category-pages": "Liczba stron",
"pageinfo-category-subcats": "Liczba podkategorii",
"pageinfo-category-files": "Liczba plików",
- "skinname-monobook": "Książka",
- "skinname-vector": "Wektor",
"markaspatrolleddiff": "oznacz edycję jako „sprawdzoną”",
"markaspatrolledtext": "Oznacz tę stronę jako „sprawdzoną”",
"markedaspatrolled": "Sprawdzone",
"qbmyoptions": "Mie pàgine",
"faq": "Chestion frequente",
"faqpage": "Project:Soèns An Ciamo",
- "vector-action-addsection": "Gionté n'argoment",
- "vector-action-delete": "Scancelé",
- "vector-action-move": "Tramudé",
- "vector-action-protect": "Protege",
- "vector-action-undelete": "Arcuperé",
- "vector-action-unprotect": "Cangé la protession",
- "vector-view-create": "Creé",
- "vector-view-edit": "Modifiché",
- "vector-view-history": "Smon-e la stòria",
- "vector-view-view": "Lese",
- "vector-view-viewsource": "Vëdde la sorgiss",
"actions": "Assion",
"namespaces": "Spassi nominaj",
"variants": "Variant",
"difference-missing-revision": "{{PLURAL:$2|Na revision|$2 revision}} dë sta diferensa ($1) a {{PLURAL:$2|l'é pa stàita|son pa stàite}} trovà.\n\n\n\nSòn a l'é normalment causà da l'andèje dapress a na veja liura stòrica a na pàgina ch'a l'é stàita scancelà. Ij detaj a peulo esse trovà ant ël [registr ëd jë scanselament ëd {{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}].",
"searchresults": "Arzultà dl'arserca",
"searchresults-title": "Arzultà dl'arserca për «$1»",
- "toomanymatches": "Parèj a-i ven fòra tròpa ròba, për piasì, ch'a preuva n'arserca diferenta.",
"titlematches": "Ant ij tìtoj dj'artìcoj",
"textmatches": "Ant ël test ëd j'artìcoj",
"notextmatches": "La vos che a l'ha ciamà a l'é pa trovasse antrames aj test dj'artìcoj",
"recentchanges-label-unpatrolled": "Sta modìfica-sì a l'é pa ancó stàita verificà",
"recentchanges-label-plusminus": "La taja dla pàgina a l'é cangià d'un nùmer ëd bytes",
"recentchanges-legend-heading": "'''Legend:'''",
- "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vëdde ëdcò [[Special:NewPages|lista dle pàgine neuve]])",
+ "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vëdde ëdcò la [[Special:NewPages|lista dle pàgine neuve]])",
"recentchanges-legend-plusminus": "(''±123'')",
"rcnotefrom": "Ambelessì sota a-i é la lista dle modìfiche da <strong>$2</strong> (mostrà fin-a a <strong>$1</strong>).",
"rclistfrom": "Mostré le modìfiche a parte da $3 $2",
"tooltip-preferences-save": "Salvé ij sò gust",
"tooltip-summary": "Anserì un curt resumé",
"common.css": "/** Ël còdes CSS che as buta ambelessì a resta dovrà ant tute le \"facie\" */",
- "monobook.css": "/* cangé st'archivi-sì për modifiché la formatassion dël sit antregh */",
"common.js": "/* Ël còdes JavaScript ch'as buta ambelessì a ven carià da vira utent për vira pàgina */",
- "monobook.js": "/* Ës messagi-sì as dovrìa pa pì dovrelo; a sò pòst ch'a dòvra [[MediaWiki:common.js]] */",
"anonymous": "{{PLURAL:$1|Utent|Utent}} anònim ëd {{SITENAME}}",
"siteuser": "$1, utent ëd {{SITENAME}}",
"anonuser": "l'utent anònim $1 ëd {{SITENAME}}",
"qbmyoptions": "زما پاڼې",
"faq": "ډ-ځ-پ",
"faqpage": "Project:ډ-ځ-پ",
- "vector-action-addsection": "سرليکونه ورگډول",
- "vector-action-delete": "ړنگول",
- "vector-action-move": "لېږدول",
- "vector-action-protect": "ژغورل",
- "vector-action-undelete": "ناړنگول",
- "vector-action-unprotect": "ژغورنه بدلول",
- "vector-view-create": "جوړول",
- "vector-view-edit": "سمول",
- "vector-view-history": "پېښليک کتل",
- "vector-view-view": "لوستل",
- "vector-view-viewsource": "سرچينه کتل",
"actions": "کړنې",
"namespaces": "نوم-تشيالونه",
"variants": "ډولونه",
"tooltip-undo": "\"ناکړ\" همدا سمون پر شا گرځوي او د سمون کړکۍ د مخکتنې په بڼه پرانيزي.\nدا کړنه د لنډيز په برخه کې د سمونونو د سببونو د ورگډولو آسانتيا برابروي.",
"tooltip-preferences-save": "غوره توبونه خوندي کول",
"tooltip-summary": "يو لنډ لنډيز کښل",
- "vector.css": "/* د CSS هره بڼه چې دلته ځای پر ځای کېږي هغه به د وېکټور د پوښ ټولو کارنانو لپاره کار کوي */",
- "vector.js": "/* د جاوا هر يو سکرېپټ چې دلته ځای پر ځای کېږي هغه به د وېکټور د پوښ ټولو کارنانو لپاره کار کوي */",
"anonymous": "د {{SITENAME}} {{PLURAL:$1|ورکنومی کارن|ورکنومي کارنان}}",
"siteuser": "د {{SITENAME}} کارن $1",
"anonuser": "د {{SITENAME}} ورکنومی کارن $1",
"pageinfo-category-pages": "د مخونو شمېر",
"pageinfo-category-subcats": "د څېرمه وېشنيزو شمېر",
"pageinfo-category-files": "د دوتنو شمېر",
- "skinname-monobook": "مونوبوک",
- "skinname-vector": "وېکټور",
"markaspatrolleddiff": "دا مخ څارل شوی په نخښه کول",
"markaspatrolledtext": "دا مخ څارل شوی په نخښه کول",
"markedaspatrolled": "دا مخ څارل شوی په نخښه کول",
"qbmyoptions": "Minhas páginas",
"faq": "FAQ",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Adicionar tópico",
- "vector-action-delete": "Eliminar",
- "vector-action-move": "Mover",
- "vector-action-protect": "Proteger",
- "vector-action-undelete": "Restaurar",
- "vector-action-unprotect": "Alterar a proteção",
- "vector-view-create": "Criar",
- "vector-view-edit": "Editar",
- "vector-view-history": "Ver histórico",
- "vector-view-view": "Ler",
- "vector-view-viewsource": "Ver código-fonte",
"actions": "Ações",
- "vector-more-actions": "Mais",
"namespaces": "Espaços nominais",
"variants": "Variantes",
"navigation-heading": "Menu de navegação",
"jumptonavigation": "navegação",
"jumptosearch": "pesquisa",
"view-pool-error": "Desculpe-nos, os servidores estão sobrecarregados neste momento.\nMuitos usuários estão tentando ver esta página.\nAguarde um instante antes de tentar acessar esta página novamente.\n\n$1",
+ "generic-pool-error": "Desculpe-nos, os servidores estão sobrecarregados neste momento.\nMuitos usuários estão tentando ver esta página.\nAguarde um instante antes de tentar acessar esta página novamente.",
"pool-timeout": "Tempo limite de espera para o bloqueio excedido",
"pool-queuefull": "A fila de processos está cheia",
"pool-errorunknown": "Erro desconhecido",
"difference-missing-revision": "{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.\n\nIsto é geralmente causado por seguir um link de histórico desatualizado para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminação].",
"searchresults": "Resultados da pesquisa",
"searchresults-title": "Resultados da pesquisa por \"$1\"",
- "toomanymatches": "Foram retornados muitos resultados. Por favor, tente um filtro de pesquisa diferente",
"titlematches": "Resultados nos títulos das páginas",
"textmatches": "Resultados nos textos das páginas",
"notextmatches": "Não foi possível localizar, no conteúdo das páginas, o termo pesquisado",
"listgrouprights-namespaceprotection-namespace": "Namespace",
"listgrouprights-namespaceprotection-restrictedto": "Direito(s) permitindo edições do usuário",
"trackingcategories": "Monitorando categorias",
+ "trackingcategories-summary": "Esta página lista categorias de monitoramento que são preenchidas automaticamente pelo software MediaWiki. Seus nomes podem ser alterados através da alteração das mensagens de sistema relevantes no namespace {{ns: 8}}.",
+ "trackingcategories-msg": "Categoria de monitoramento",
+ "trackingcategories-desc": "Critérios de inclusão de categoria",
+ "noindex-category-desc": "A página não é indexada por robôs, porque possui a palavra mágica <code><nowiki>__NOINDEX__</nowiki></code> e está em um namespace onde a flag é permitida.",
+ "post-expand-template-inclusion-category-desc": "Após expandir todos as predefinições, o tamanho da página é maior que o valor permitido na variável <code>$wgMaxArticleSize</code>, por isso algumas predefinições não foram expandidas.",
"trackingcategories-disabled": "A categoria está desabilitada",
"mailnologin": "Nenhum endereço de envio",
"mailnologintext": "Necessita de estar [[Special:UserLogin|autenticado]] e de possuir um endereço de e-mail válido nas suas [[Special:Preferences|preferências]] para poder enviar um e-mail a outros usuários.",
"tooltip-preferences-save": "Salvar preferências",
"tooltip-summary": "Forneça um breve resumo",
"common.css": "/** o código CSS colocado aqui será aplicado a todos os temas */",
- "monobook.css": "/* o código CSS colocado aqui terá efeito nos usuários do tema Monobook */",
"common.js": "/* Códigos JavaScript aqui colocados serão carregados por todos aqueles que acessarem alguma página deste wiki */",
- "monobook.js": "/* Qualquer JavaScript aqui colocado afetará os usuários do skin MonoBook */",
- "vector.js": "/* Qualquer JavaScript aqui colocado afetará os usuários do skin Vector */",
"anonymous": "{{PLURAL:$1|Usuário anônimo|Usuários anônimos}} da {{SITENAME}}",
"siteuser": "{{GENDER:$2|um usuário|uma usuária|um usuário}} da {{SITENAME}} ($1)",
"anonuser": "usuário anônimo $1 da {{SITENAME}}",
"pageinfo-category-pages": "Número de páginas",
"pageinfo-category-subcats": "Número de subcategorias",
"pageinfo-category-files": "Número de arquivos",
- "skinname-monobook": "MonoBook",
"markaspatrolleddiff": "Marcar como patrulhada",
"markaspatrolledtext": "Marcar esta página como patrulhada",
"markedaspatrolled": "Marcado como verificado",
"watchlistedit-raw-done": "Sua lista de páginas vigiadas foi atualizada.",
"watchlistedit-raw-added": "{{PLURAL:$1|Foi adicionado um título|Foram adicionados $1 títulos}}:",
"watchlistedit-raw-removed": "{{PLURAL:$1|Foi removido um título|Foram removidos $1 títulos}}:",
+ "watchlistedit-clear-legend": "Limpar a lista de páginas vigiadas",
"watchlistedit-clear-explain": "Todos os títulos serão removidos da sua lista de páginas vigiadas",
"watchlistedit-clear-titles": "Títulos:",
"watchlistedit-clear-submit": "Limpar a lista de páginas vigiadas (Esta ação é permanente!)",
"htmlform-no": "Não",
"htmlform-yes": "Sim",
"htmlform-chosen-placeholder": "Selecione uma opção",
+ "htmlform-cloner-required": "Pelo menos um valor é requerido",
"sqlite-has-fts": "$1 com suporte de pesquisa de texto completo",
"sqlite-no-fts": "$1 sem suporte de pesquisa de texto completo",
"logentry-delete-delete": "$1 apagou a página $3",
"qbmyoptions": "As minhas páginas",
"faq": "Perguntas frequentes",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Adicionar tópico",
- "vector-action-delete": "Eliminar",
- "vector-action-move": "Mover",
- "vector-action-protect": "Proteger",
- "vector-action-undelete": "Restaurar",
- "vector-action-unprotect": "Alterar protecção",
- "vector-view-create": "Criar",
- "vector-view-edit": "Editar",
- "vector-view-history": "Ver histórico",
- "vector-view-view": "Ler",
- "vector-view-viewsource": "Ver fonte",
"actions": "Acções",
- "vector-more-actions": "Mais",
"namespaces": "Domínios",
"variants": "Variantes",
"navigation-heading": "Menu de navegação",
"difference-missing-revision": "{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.\n\nIsto é geralmente causado por seguir uma ligação de histórico desatualizada para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].",
"searchresults": "Resultados da pesquisa",
"searchresults-title": "Resultados da pesquisa de \"$1\"",
- "toomanymatches": "Foram devolvidos demasiados resultados; tente outro termo de pesquisa, por favor",
"titlematches": "Resultados no título das páginas",
"textmatches": "Resultados no conteúdo das páginas",
"notextmatches": "Não foi possível localizar, no conteúdo das páginas, o termo pesquisado",
"largefileserver": "O tamanho deste ficheiro é superior ao permitido pela configuração do servidor.",
"emptyfile": "O ficheiro que enviou parece estar vazio.\nIsto pode dever-se a um erro no nome do ficheiro.\nVerifique se é realmente este o ficheiro que deseja carregar, por favor.",
"windows-nonascii-filename": "A wiki não aceita nomes de ficheiros com caracteres especiais.",
- "fileexists": "Já existe um ficheiro com este nome.\nVerifique <strong>[[:$1]]</strong> caso não tenha a certeza de que quer alterar o ficheiro atual, por favor.\n[[$1|thumb]]",
+ "fileexists": "Já existe um ficheiro com este nome. Verifique <strong>[[:$1]]</strong> caso não tenha a certeza de que quer alterá-lo.\n[[$1|thumb]]",
"filepageexists": "A página de descrição deste ficheiro já foi criada em <strong>[[:$1]]</strong>, mas neste momento não existe nenhum ficheiro com este nome.\nO resumo que introduzir não aparecerá na página de descrição.\nPara fazê-lo aparecer, terá de editar a página manualmente.\n[[$1|thumb]]",
- "fileexists-extension": "Já existe um ficheiro de nome semelhante: [[$2|thumb]]\n* Nome do ficheiro que está sendo carregado: <strong>[[:$1]]</strong>\n* Nome do ficheiro existente: <strong>[[:$2]]</strong>\nEscolha um nome diferente, por favor.",
+ "fileexists-extension": "Já existe um ficheiro de nome semelhante: [[$2|thumb]]\n* Nome do ficheiro que está a ser carregado: <strong>[[:$1]]</strong>\n* Nome do ficheiro existente: <strong>[[:$2]]</strong>\nTalvez prefira definir um nome mais distinto?",
"fileexists-thumbnail-yes": "O ficheiro aparenta ser uma imagem de tamanho reduzido (''miniatura'', ou ''thumbnail)''. [[$1|thumb]]\nVerifique o ficheiro <strong>[[:$1]]</strong>, por favor.\nSe este ficheiro é a mesma imagem mas no tamanho original, não é necessário carregar uma miniatura.",
"file-thumbnail-no": "O nome do ficheiro começa por <strong>$1</strong>.\nParece ser uma imagem de tamanho reduzido (uma ''miniatura'' ou ''thumbnail)''.\nSe tiver a imagem original de maior dimensão, envie-a em vez desta. Se não, altere o nome do ficheiro, por favor.",
"fileexists-forbidden": "Já existe um ficheiro com este nome, e não pode ser reescrito.\nSe ainda pretende carregar o seu ficheiro volte atrás e use outro nome, por favor. [[File:$1|thumb|center|$1]]",
"tooltip-preferences-save": "Gravar preferências",
"tooltip-summary": "Introduza um resumo breve",
"interlanguage-link-title": "$1 — $2",
+ "interlanguage-link-title-nonlang": "$1 – $2",
"common.css": "/* Código CSS colocado aqui será aplicado a todos os temas */",
- "monobook.css": "/* Código CSS colocado aqui afectará os utilizadores do tema Monobook */",
- "vector.css": "/* Código CSS colocado aqui afectará os utilizadores do tema Vector */",
"print.css": "/* Código CSS colocado aqui afectará as impressões */",
"noscript.css": "/* Os estilos CSS colocados aqui afetarão os utilizadores que tenham o JavaScript desativado em seus navegadores */",
"common.js": "/* Código Javascript colocado aqui será carregado para todos os utilizadores em cada carregamento de página */",
- "monobook.js": "/* Código Javascript colocado aqui será carregado para utilizadores do tema Monobook */",
- "vector.js": "/* Código Javascript colocado aqui será carregado para utilizadores do tema Vector */",
"anonymous": "{{PLURAL:$1|Utilizador anónimo|Utilizadores anónimos}} da {{SITENAME}}",
"siteuser": "$1 da {{SITENAME}}",
"anonuser": "utilizador anónimo $1 da {{SITENAME}}",
"pageinfo-category-pages": "Número de páginas",
"pageinfo-category-subcats": "Número de subcategorias",
"pageinfo-category-files": "Número de ficheiros",
- "skinname-monobook": "MonoBook",
- "skinname-vector": "Vector",
"markaspatrolleddiff": "Marcar como patrulhada",
"markaspatrolledtext": "Marcar esta página como patrulhada",
"markedaspatrolled": "Marcada como patrulhada",
"version-hook-name": "Nome do hook",
"version-hook-subscribedby": "Subscrito por",
"version-version": "(Versão $1)",
+ "version-no-ext-name": "[sem nome]",
"version-license": "Licença do MediaWiki",
"version-ext-license": "Licença",
"version-ext-colheader-name": "Extensão",
"faqpage": "{{doc-important|Do not translate <code>Project:</code> part.}}\n\"FAQ\" is short for \"frequently asked questions\".\n\nThis page is only linked in CologneBlue (an old skin), not in Monobook or Vector.",
"sitetitle": "{{Ignore}}",
"sitesubtitle": "{{Ignore}}",
- "vector-action-addsection": "Used in the Vector skin. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}",
- "vector-action-delete": "Used in the Vector skin, as the name of a tab at the top of the page. See for example {{canonicalurl:Main_Page|useskin=vector}}\n\n{{Identical|Delete}}",
- "vector-action-move": "Used in the Vector skin, on the tabs at the top of the page. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}\n\n{{Identical|Move}}",
- "vector-action-protect": "Tab at top of page, in vector skin\n\n{{Identical|Protect}}",
- "vector-action-undelete": "Tab at top of page, in vector skin.\n{{Identical|Undelete}}",
- "vector-action-unprotect": "Tab at top of page, in vector skin.\n{{Identical|Change protection}}",
- "vector-view-create": "Tab label in the Vector skin. See for example {{canonicalurl:Foo|useskin=vector}}\n{{Identical|Create}}",
- "vector-view-edit": "Tab label in the Vector skin. See for example {{canonicalurl:Main_Page|useskin=vector}}\n{{Identical|Edit}}",
- "vector-view-history": "Tab label in the Vector skin. See for example {{canonicalurl:Main_Page|useskin=vector}}\n{{Identical|View history}}",
- "vector-view-view": "Tab label in the Vector skin (verb). See for example {{canonicalurl:Main_Page|useskin=vector}}.\n{{Identical|Read}}",
- "vector-view-viewsource": "Tab label in the Vector skin.\n{{Identical|View source}}",
"actions": "{{Identical|Action}}",
- "vector-more-actions": "Label in the Vector skin's menu for the less-important or rarer actions which are not shown as tabs (like moving the page, or for sysops deleting or protecting the page), as well as (for users with a narrow viewing window in their browser) the less-important tab actions which the user's browser is unable to fit in. {{Identical|More}}",
"namespaces": "{{Identical|Namespace}}",
"variants": "Used by the Vector skin.",
"navigation-heading": "Heading shown above the navigation menu (sidebar) for screen-readers (or in non-standard skins).",
"mergehistory-empty": "Used in [[Special:MergeHistory]].",
"mergehistory-success": "Used in [[Special:MergeHistory]].\n* $1 - target page title\n* $2 - destination page title\n* $3 - number of revisions which succeeded to merge",
"mergehistory-fail": "Used as error message in [[Special:MergeHistory]].",
+ "mergehistory-fail-toobig": "Used as error message in [[Special:MergeHistory]].\n* $1 - maximum allowed number of revisions that can be moved",
"mergehistory-no-source": "Used as error message in [[Special:MergeHistory]].\n* $1 - source page title\nSee also:\n* {{msg-mw|mergehistory-invalid-source}}\n* {{msg-mw|mergehistory-invalid-destination}}\n* {{msg-mw|mergehistory-no-destination}}\n* {{msg-mw|mergehistory-same-destination}}",
"mergehistory-no-destination": "Used as error message in [[Special:MergeHistory]].\n* $1 - destination page title\nSee also:\n* {{msg-mw|mergehistory-invalid-source}}\n* {{msg-mw|mergehistory-no-source}}\n* {{msg-mw|mergehistory-invalid-destination}}\n* {{msg-mw|mergehistory-same-destination}}",
"mergehistory-invalid-source": "Used as error message in [[Special:MergeHistory]].\n\nSee also:\n* {{msg-mw|mergehistory-no-source}}\n* {{msg-mw|mergehistory-invalid-destination}}\n* {{msg-mw|mergehistory-no-destination}}\n* {{msg-mw|mergehistory-same-destination}}",
"search-summary": "{{doc-specialpagesummary|search}}",
"searchresults": "This is the title of the page that contains the results of a search.\n\n{{Identical|Search results}}",
"searchresults-title": "Appears as page title in the html header of the search result special page.\n\nParameters:\n* $1 - the search term",
- "toomanymatches": "Used as section header in [[Special:Search]], when there are too many hits.",
"titlematches": "Used as section header in [[Special:Search]].\n\nThis message is followed by search results.",
"textmatches": "When displaying search results",
"notextmatches": "Error message when there are no results",
"group-suppress-member": "{{doc-group|suppress|member}}\nThis is a member of the optional (disabled by default) user group, meant for the [[mw:RevisionDelete|RevisionDelete]] feature, to change the visibility of revisions through [[Special:RevisionDelete]].\n\n{{Identical|Oversight}}",
"grouppage-user": "{{doc-group|user|page}}",
"grouppage-autoconfirmed": "{{doc-group|autoconfirmed|page}}",
- "grouppage-bot": "{{doc-group|bot|page}}",
+ "grouppage-bot": "{{doc-group|bot|page}}\n{{Identical|Bot}}",
"grouppage-sysop": "{{doc-group|sysop|page}}",
"grouppage-bureaucrat": "{{doc-group|bureaucrat|page}}",
"grouppage-suppress": "{{doc-group|suppress|page}}\n{{Identical|Oversight}}",
"tooltip-summary": "Used as tooltip for Summary input box in Editor page.\n\nSee also:\n* {{msg-mw|Summary}}\n* {{msg-mw|Accesskey-summary}}\n* {{msg-mw|Tooltip-summary}}",
"interlanguage-link-title": "{{Optional}}\nFormat of a sidebar interwiki link tooltip. Parameters:\n* $1 - page name in the target wiki\n* $2 - target wiki language autonym",
"interlanguage-link-title-langonly": "{{ignored}}Interlanguage link title. Parameters: $1 replaced with a language name.",
+ "interlanguage-link-title-nonlang": "{{Optional}}\nFormat of a tooltip for a sidebar interwiki link that points to a specific project. Parameters:\n* $1 - page name in the target wiki\n* $2 - name of the target wiki (probably not a language name)",
+ "interlanguage-link-title-nonlangonly": "{{ignored}}Interlanguage link title. Parameters: $1 replaced with name of the target wiki (probably not a language name).",
"common.css": "{{optional}}\nCSS applied to all users.",
- "monobook.css": "{{optional}}\nCSS applied to users using Monobook skin.",
- "vector.css": "{{optional}}",
"print.css": "{{optional}}",
"noscript.css": "{{optional}}",
"group-autoconfirmed.css": "{{doc-group|autoconfirmed|css}}",
"group-sysop.css": "{{doc-group|sysop|css}}",
"group-bureaucrat.css": "{{doc-group|bureaucrat|css}}",
"common.js": "{{optional}}\nJS for all users.",
- "monobook.js": "{{optional}}\nJS for users using Monobook skin.",
- "vector.js": "{{optional}}",
"group-autoconfirmed.js": "{{doc-group|autoconfirmed|js}}",
"group-user.js": "{{doc-group|user|js}}",
"group-bot.js": "{{doc-group|bot|js}}",
"pageinfo-category-pages": "See also:\n* {{msg-mw|Pageinfo-category-subcats}}\n* {{msg-mw|Pageinfo-category-files}}",
"pageinfo-category-subcats": "See also:\n* {{msg-mw|Pageinfo-category-pages}}\n* {{msg-mw|Pageinfo-category-files}}",
"pageinfo-category-files": "See also:\n* {{msg-mw|Pageinfo-category-pages}}\n* {{msg-mw|Pageinfo-category-subcats}}",
- "skinname-monobook": "{{optional}}",
- "skinname-vector": "{{optional}}",
"markaspatrolleddiff": "{{doc-actionlink}}\nSee also:\n* {{msg-mw|Markaspatrolledtext}}\n{{Identical|Mark as patrolled}}",
"markaspatrolledlink": "{{notranslate}}\nParameters:\n* $1 - link which has text {{msg-mw|Markaspatrolledtext}}",
"markaspatrolledtext": "{{doc-actionlink}}\nSee also:\n* {{msg-mw|Markaspatrolleddiff}}",
"months": "Full word for \"months\". $1 is the number of months.",
"years": "Full word for \"years\".\n\nParameters:\n* $1 - the number of years",
"ago": "Phrase for indicating how long ago something happened. Parameters:\n* $1 - some kind of timestamp\n{{Identical|Ago}}",
- "just-now": "Phrase for indicating something happened just now.",
+ "just-now": "Phrase for indicating something happened just now.\n{{Identical|Just now}}",
"hours-ago": "Phrase for indicating that something occurred a certain number of hours ago.\n\nParameters:\n* $1 - number of hours",
"minutes-ago": "Phrase for indicating that something occurred a certain number of minutes ago.\n\nParameters:\n* $1 - number of minutes",
"seconds-ago": "Phrase for indicating that something occurred a certain number of seconds ago.\n\nParameters:\n* $1 - number of seconds",
"version-hook-name": "Shown in [[Special:Version]].\n\nFor meaning of hook see [[mw:Special:MyLanguage/Manual:Hooks|mw:Manual:Hooks]] and [[w:Hooking]].",
"version-hook-subscribedby": "Shown in [[Special:Version]]",
"version-version": "{{Optional}}\nUsed in [[Special:Version]]. Preceded by the MediaWiki extension name.\n\nParameters:\n* $1 - version number of the extension",
+ "version-no-ext-name": "Used in [[Special:Version]], in the rows of the main table when a name for an extension is not provided.",
"version-svn-revision": "{{Identical|Revision}}{{optional}}\nUsed in [[Special:Version]], preceeding the Subversion revision numbers of the extensions loaded inside brackets, like this: \"({{int:version-revision}} r012345\"). Parameters:\n* $1 - (Unused) directory revision number or empty string\n* $2 - checkout revision number",
"version-license": "Used specifically for the MediaWiki software.\n\nUsed as heading in [[Special:Version]].",
"version-ext-license": "Used in [[Special:Version]].\n\nUsed as label for the link pointing to the extension's license page. e.g. [[Special:Version/License/Maps]]\n{{Identical|License}}",
"qbmyoptions": "Akllanaykuna",
"faq": "Pasaq tapuykuna",
"faqpage": "Project:Pasaq tapuykuna",
- "vector-action-addsection": "Allwiyta yapay",
- "vector-action-delete": "Qulluy",
- "vector-action-move": "Astay",
- "vector-action-protect": "Amachay",
- "vector-action-undelete": "Qullusqata paqarichiy",
- "vector-action-unprotect": "Amachayta wakinchay",
- "vector-view-create": "Kamariy",
- "vector-view-edit": "Llamk'apuy",
- "vector-view-history": "Wiñay kawsayta qhaway",
- "vector-view-view": "Ñawiriy",
- "vector-view-viewsource": "Pukyu qillqata qhaway",
"actions": "Ruraykuna",
- "vector-more-actions": "Aswan",
"namespaces": "Suti k'itikuna",
"variants": "Ñawra rikch'akuykuna",
"navigation-heading": "Wamp'una last'a",
"difference-missing-revision": "Kay wakin kaymanta ($1) {{PLURAL:$2|huk musuqchasqa|$2 musuqchasqakuna}} manam tarisqachu.\n\nKayqa tukurqanman qullusqa p'anchaman t'inkimuq mawk'ayasqa wiñay kawsay t'inkiraykuchá.\nImaymanata [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qulluy hallch'apim] tariykiman.",
"searchresults": "Maskaymanta tarisqakuna",
"searchresults-title": "\"$1\" nisqapaq maskaspa taripasqakuna",
- "toomanymatches": "Nisyu taripasqakunam kutisqa, ama hina kaspa, huk taripanawan ruraykachay",
"titlematches": "P'anqakunap sutinkunapi tarisqa",
"textmatches": "P'anqakunap qillqankunapi tarisqa",
"notextmatches": "Manam ima p'anqakunap qillqankunapipas tarisqachu",
"tooltip-preferences-save": "Akllasqakunata waqaychay",
"tooltip-summary": "Pisichaychata yaykuchiy",
"common.css": "/* Churamusqa CSS chantakunaqa tukuy qarakunapim llamk'anqa */",
- "monobook.css": "/* Kayman churasqa CSS nisqaqa Monobook qaratam hukchanqa tukuy internet tiyanapaq */",
"print.css": "/* Churamusqa CSS chantakunaqa ch'ipachinap rikch'akuynintam hukchanqa */",
"common.js": "/* Ima kaypi kaq JavaScript qillqapas tukuy ruraqkunapaq tukuy p'anqakunap tukuy chaqnankunapi chaqnamusqa kanqa. */",
- "monobook.js": "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas MonoBook nisqata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
"anonymous": "{{SITENAME}}pi sutinnaq {{PLURAL:$1|ruraq|ruraqkuna}}",
"siteuser": "{{SITENAME}}-pa $1 sutiyuq ruraqnin",
"anonuser": "{{SITENAME}} rakiqunannaq ruraq $1",
"qbmyoptions": "Mia pagina",
"faq": "FAQ",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Agiuntar chapitel",
- "vector-action-delete": "Stizzar",
- "vector-action-move": "Spustar",
- "vector-action-protect": "Bloccar",
- "vector-action-undelete": "Restituir",
- "vector-action-unprotect": "Midar la protecziun",
- "vector-view-create": "Crear",
- "vector-view-edit": "Modifitgar",
- "vector-view-history": "Cronologia",
- "vector-view-view": "Leger",
- "vector-view-viewsource": "Mussar il code",
"actions": "Acziuns",
"namespaces": "Tip da pagina",
"variants": "Variantas",
"difference-missing-revision": "{{PLURAL:$2|Ina versiun|$2 versiuns}} da questa differenza ($1) {{PLURAL:$2|n'è betg vegnida chattada|n'èn betg vegnidas chattadas}}.\n\nPer ordinari vegn quai chaschunà dad ina colliaziun da diff antiquada ad ina pagian ch'è vegnida stizzada. \nDetagls pon vegnir chattads en il [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protocol da stizzar].",
"searchresults": "Resultats da tschertga",
"searchresults-title": "Resultats da tschertga per \"$1\"",
- "toomanymatches": "Il dumber dals resultats è memia grond. Tschertga per plaschair auters terms.",
"titlematches": "Titels da paginas che correspundan",
"textmatches": "Texts da paginas che correspundan",
"notextmatches": "Nagin text correspunda",
"tooltip-preferences-save": "Memorisar las preferenzas",
"tooltip-summary": "Endatescha ina curta resumaziun",
"common.css": "",
- "monobook.css": "/* editescha quest file per adattar il skin momobook per l'entira pagina */",
- "monobook.js": "",
"anonymous": "{{PLURAL:$1|In utilisader anonim|Utilisaders anonims}} da {{SITENAME}}",
"siteuser": "utilisader $1 da {{SITENAME}}",
"anonuser": "Utilisader anonim $1 da {{SITENAME}}",
"qbmyoptions": "Paginile mele",
"faq": "Întrebări frecvente",
"faqpage": "Project:Întrebări frecvente",
- "vector-action-addsection": "Mesaj nou",
- "vector-action-delete": "Ștergere",
- "vector-action-move": "Redenumire",
- "vector-action-protect": "Protejare",
- "vector-action-undelete": "Recuperare",
- "vector-action-unprotect": "Modificare protecție",
- "vector-view-create": "Creare",
- "vector-view-edit": "Modificare",
- "vector-view-history": "Istoric",
- "vector-view-view": "Lectură",
- "vector-view-viewsource": "Sursă pagină",
"actions": "Acțiuni",
- "vector-more-actions": "Mai mult",
"namespaces": "Spații de nume",
"variants": "Variante",
"navigation-heading": "Meniu de navigare",
"mergehistory-empty": "Reviziile nu pot fi combinate.",
"mergehistory-success": "$3 {{PLURAL:$3|versiune|versiuni|de versiuni}} ale [[:$1]] {{PLURAL:$3|a fost unită|au fost unite|au fost unite}} cu succes în [[:$2]].",
"mergehistory-fail": "Nu se poate executa combinarea istoricului, te rog verifică parametrii pagină și timp.",
+ "mergehistory-fail-toobig": "Nu s-a putut efectua unirea istoricelor întrucât s-ar fi depășit limita de $1 {{PLURAL:$1|versiune|versiuni|de versiuni}} mutat{{PLURAL:$1|ă|e}}.",
"mergehistory-no-source": "Pagina sursă $1 nu există.",
"mergehistory-no-destination": "Pagina de destinație $1 nu există.",
"mergehistory-invalid-source": "Pagina sursă trebuie să aibă un titlu valid.",
"difference-missing-revision": "{{PLURAL:$2|O versiune a|$2 versiuni ale|$2 de versiuni ale}} acestei diferențe ($1) nu {{PLURAL:$2|a fost găsită|au fost găsite}}.\n\nAcest lucru se întâmplă de obicei atunci când se accesează o legătură expirată către istoricul unei pagini șterse.\nDetalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].",
"searchresults": "Rezultatele căutării",
"searchresults-title": "Rezultatele căutării pentru „$1”",
- "toomanymatches": "Prea multe rezultate au fost întoarse, încercă o căutare diferită",
"titlematches": "Rezultate din titlurile paginilor",
"textmatches": "Rezultate din conținutul paginilor",
"notextmatches": "Nici un rezultat în textele articolelor",
"largefileserver": "Fișierul este mai mare decât este configurat serverul să permită.",
"emptyfile": "Fișierul pe care l-ați încărcat pare a fi gol. Aceasta poate fi datorită unei greșeli în numele fișierului. Verificați dacă într-adevăr doriți să încărcați acest fișier.",
"windows-nonascii-filename": "Acest wiki nu acceptă nume de fișiere care conțin caractere speciale.",
- "fileexists": "Un fișier cu același nume există deja, vă rugăm verificați <strong>[[:$1]]</strong> dacă nu sunteți sigur dacă doriți să îl modificați.\n[[$1|thumb]]",
+ "fileexists": "Un fișier cu același nume există deja; vă rugăm să verificați <strong>[[:$1]]</strong> în cazul în care nu sunteți sigur{{GENDER:||ă|}} că doriți să îl modificați.\n[[$1|thumb]]",
"filepageexists": "Pagina cu descrierea fișierului a fost deja creată la <strong>[[:$1]]</strong>, dar niciun fișier cu acest nume nu există în acest moment.\nSumarul pe care l-ai introdus nu va apărea în pagina cu descriere.\nPentru ca sumarul tău să apară, va trebui să îl adaugi manual.\n[[$1|miniatură]]",
- "fileexists-extension": "Un fișier cu un nume similar există: [[$2|thumb]]\n* Numele fișierului de încărcat: <strong>[[:$1]]</strong>\n* Numele fișierului existent: <strong>[[:$2]]</strong>\nTe rog alege alt nume.",
+ "fileexists-extension": "Un fișier cu un nume similar există: [[$2|thumb]]\n* Numele fișierului de încărcat: <strong>[[:$1]]</strong>\n* Numele fișierului existent: <strong>[[:$2]]</strong>\nPoate doriți să utilizați un nume mai distinctiv?",
"fileexists-thumbnail-yes": "Fișierul pare a fi o imagine cu o rezoluție scăzută ''(thumbnail)''. [[$1|thumb]]\nVerifică fișierul<strong>[[:$1]]</strong>.\nDacă fișierul verificat este identic cu imaginea originală nu este necesară încărcarea altui thumbnail.",
"file-thumbnail-no": "Numele fișierului începe cu <strong>$1</strong>.\nSe pare că este o imagine cu dimensiune redusă''(thumbnail)''.\nDacă ai această imagine la rezoluție mare încarc-o pe aceasta, altfel schimbă numele fișierului.",
"fileexists-forbidden": "Un fișier cu acest nume există deja și nu poate fi rescris.\nMergeți înapoi și încărcați acest fișier sub un nume nou. [[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "Ştergerea sau restaurarea fișierelor este temporar dezactivată pe timpul lucrărilor de mentenanță.",
"filedelete-maintenance-title": "Fișierul nu a putut fi șters",
"mimesearch": "Căutare MIME",
- "mimesearch-summary": "This page enables the filtering of files for its MIME-type.\nInput: contenttype/subtype, e.g. <code>image/jpeg</code>.\n\n\nAceastă pagină specială permite căutarea fișierelor în funcție de tipul MIME (Multipurpose Internet Mail Extensions). Cele mai des întâlnite sunt:\n* Imagini : <code>image/jpeg</code>\n* Diagrame : <code>image/png</code>, <code>image/svg+xml</code>\n* Imagini animate : <code>image/gif</code>\n* Fișiere sunet : <code>audio/ogg</code>, <code>audio/x-ogg</code>\n* Fișiere video : <code>video/ogg</code>, <code>video/x-ogg</code>\n* Fișiere PDF : <code>application/pdf</code>",
+ "mimesearch-summary": "Această pagină permite filtrarea fișierelor în funcție de tipul MIME.\nDate de intrare: tip_de_conținut/subtip sau tip_de_conținut/*; ex. <code>image/jpeg</code>.",
"mimetype": "Tip MIME:",
"download": "descarcă",
"unwatchedpages": "Pagini neurmărite",
"tooltip-preferences-save": "Salvează preferințele",
"tooltip-summary": "Descrieți pe scurt modificarea",
"interlanguage-link-title": "$1 – $2",
+ "interlanguage-link-title-nonlang": "$1 – $2",
"common.css": "/** CSS plasate aici vor fi aplicate tuturor aparițiilor */",
- "monobook.css": "/* modificați acest fișier pentru a adapta înfățișarea monobook-ului pentru tot situl*/",
- "vector.css": "/* CSS plasate aici vor afecta utilizatorii stilului Vector */",
"print.css": "/* CSS plasate aici vor afecta modul în care paginile vor fi imprimate */",
"anonymous": "{{PLURAL:$1|Utilizator anonim|Utilizatori anonimi}} ai {{SITENAME}}",
"siteuser": "Utilizator {{SITENAME}} $1",
"pageinfo-category-pages": "Număr de pagini",
"pageinfo-category-subcats": "Număr de subcategorii",
"pageinfo-category-files": "Număr de fișiere",
- "skinname-monobook": "Monobook",
- "skinname-vector": "Vector",
"markaspatrolleddiff": "Marchează pagina ca verificată",
"markaspatrolledtext": "Marchează această pagină ca verificată",
"markedaspatrolled": "Pagină nouă verificată",
"qbmyoptions": "Pàggene mije",
"faq": "FAQ",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Aggiunge 'na discussiona",
- "vector-action-delete": "Scangille",
- "vector-action-move": "Spuèste",
- "vector-action-protect": "Protegge",
- "vector-action-undelete": "Repristine",
- "vector-action-unprotect": "Cange 'a protezione",
- "vector-view-create": "Ccreje",
- "vector-view-edit": "Cange",
- "vector-view-history": "Vide 'u cunde",
- "vector-view-view": "Ligge",
- "vector-view-viewsource": "Vide 'u sorgende",
"actions": "Aziune",
"namespaces": "Namespace",
"variants": "Variande",
"difference-missing-revision": "{{PLURAL:$2|'Na revisione|$2 revisiune}} de sta differenze ($1) {{PLURAL:$2|non g'onne|non g'onne}} state acchiate.\n\nQuiste succede normalmende purcé 'u cunde jè collegate a 'na pàgene ca ha state scangellate.\nLe dettaglie le puè acchià jndr'à l'[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} archivije de le scangellaziune].",
"searchresults": "Resultete d'a ricerche",
"searchresults-title": "Resultete d'a ricerche pe \"$1\"",
- "toomanymatches": "Troppe combronde sciute bbuene onne state returnete, pe piacere prueve cu 'n'otra inderrogazione",
"titlematches": "'U titele d'a pàgene se iacchje",
"textmatches": "'U teste d'a pàgene combacie",
"notextmatches": "Nisciune teste de pàgene s'accocchie cu 'a recerche",
"tooltip-summary": "Mitte 'nu riepileghe piccinne",
"interlanguage-link-title": "$1 - $2",
"common.css": "/* 'U CSS ca se iacchie aqquà avène applicate a tutte le masckere */",
- "monobook.css": "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Monobook */",
- "vector.css": "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Vettore */",
"print.css": "/* 'U CSS ca se iacchie aqquà avène applicate a 'u resultate d'a stambe */",
"noscript.css": "/* 'U CSS ca se iacchie aqquà l'ausane le utinde cu 'u Javascript disabbilitate */",
"group-autoconfirmed.css": "/* 'U CSS ca se iacchie aqquà ave effettue seulamende sus a le utinde autoconfirmatarie */",
"group-sysop.css": "/* 'U CSS ca se iacchie aqquà ave effettue seulamende sus a le utinde amministrature */",
"group-bureaucrat.css": "/* 'U CSS ca se iacchie aqquà ave effettue seulamende sus a le utinde burocrate */",
"common.js": "/* Ogne JavaScript aqquà avène carecate pe tutte le utinde sus a ogne pàgene carecate. */",
- "monobook.js": "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere MonoBook */",
- "vector.js": "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Vettore */",
"group-autoconfirmed.js": "/* Ogne JavaScript aqquà avène carecate pe le utinde autoconfirmatarie */",
"group-bot.js": "/* Ogne JavaScript aqquà avène carecate pe le bot */",
"group-sysop.js": "/* Ogne JavaScript aqquà avène carecate pe le utinde amministrature */",
"pageinfo-category-pages": "Numere de pàggene",
"pageinfo-category-subcats": "Numere de sottocategorije",
"pageinfo-category-files": "Numere de file",
- "skinname-monobook": "MonoBook",
- "skinname-vector": "Vettore",
"markaspatrolleddiff": "Signe cumme condrollate",
"markaspatrolledtext": "Signe sta pàgene cumme condrollate",
"markedaspatrolled": "Signate cumme condrollate",
"version-hook-name": "Nome de l'hook",
"version-hook-subscribedby": "Sottoscritte da",
"version-version": "(Versione $1)",
+ "version-no-ext-name": "[nisciune nome]",
"version-svn-revision": "(r$2)",
"version-license": "Licenze",
"version-ext-license": "Licenze",
"qbmyoptions": "Ваши настройки",
"faq": "ЧаВО",
"faqpage": "Project:ЧаВО",
- "vector-action-addsection": "Добавить тему",
- "vector-action-delete": "Удалить",
- "vector-action-move": "Переименовать",
- "vector-action-protect": "Защитить",
- "vector-action-undelete": "Восстановить",
- "vector-action-unprotect": "Изменить защиту",
- "vector-view-create": "Создание",
- "vector-view-edit": "Править",
- "vector-view-history": "История",
- "vector-view-view": "Читать",
- "vector-view-viewsource": "Просмотр разметки",
"actions": "Действия",
- "vector-more-actions": "Ещё",
"namespaces": "Пространства имён",
"variants": "Варианты",
"navigation-heading": "Навигация",
"difference-missing-revision": "Не {{PLURAL:$2|1=найдена|найдены}} {{PLURAL:$2|$2 версия|$2 версий|$2 версии|1=одна из версий}} для этого сравнения ($1).\n\nТакое обычно случается при переходе по устаревшей ссылке сравнения версий для страницы, которая была удалена.\nПодробности могут быть в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
"searchresults": "Результаты поиска",
"searchresults-title": "Поиск «$1»",
- "toomanymatches": "Найдено слишком много соответствий; пожалуйста, попробуйте сформулировать запрос иначе",
"titlematches": "Совпадения в названиях страниц",
"textmatches": "Совпадения в текстах страниц",
"notextmatches": "Нет совпадений в текстах страниц",
"largefileserver": "Размер файла превышает максимально разрешённый.",
"emptyfile": "Загруженный вами файл, вероятно, пустой. Возможно, это произошло из-за ошибки при наборе имени файла. Пожалуйста, проверьте, действительно ли вы хотите загрузить этот файл.",
"windows-nonascii-filename": "Эта вики не поддерживает имена файлов с символами, отсутствующими в таблице ASCII.",
- "fileexists": "Файл с этим именем уже существует, пожалуйста, проверьте <strong>[[:$1]]</strong>, если вы не уверены, что хотите заменить его.\n[[$1|thumb]]",
+ "fileexists": "Файл с этим именем уже существует, пожалуйста, проверьте <strong>[[:$1]]</strong>, если {{GENDER:|вы}} не уверены, что хотите заменить его.\n[[$1|thumb]]",
"filepageexists": "Страница описания для этого файла уже создана как <strong>[[:$1]]</strong>, но файла с таким именем сейчас нет.\nВведённое описание не появится на странице описания файла.\nЧтобы добавить новое описание, вам придётся изменить его вручную.\n[[$1|thumb]]",
- "fileexists-extension": "СÑ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82 Ñ\84айл Ñ\81 поÑ\85ожим именем: [[$2|thumb]]\n* Ð\98мÑ\8f загÑ\80Ñ\83женного Ñ\84айла: <strong>[[:$1]]</strong>\n* Ð\98мÑ\8f Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83Ñ\8eÑ\89его Ñ\84айла: <strong>[[:$2]]</strong>\nÐ\9fожалÑ\83йÑ\81Ñ\82а, вÑ\8bбеÑ\80иÑ\82е дÑ\80Ñ\83гое имÑ\8f.",
+ "fileexists-extension": "СÑ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82 Ñ\84айл Ñ\81 поÑ\85ожим именем: [[$2|thumb]]\n* Ð\98мÑ\8f загÑ\80Ñ\83женного Ñ\84айла: <strong>[[:$1]]</strong>\n* Ð\98мÑ\8f Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83Ñ\8eÑ\89его Ñ\84айла: <strong>[[:$2]]</strong>\nÐ\9cожеÑ\82 бÑ\8bÑ\82Ñ\8c, вÑ\8b Ñ\85оÑ\82иÑ\82е иÑ\81полÑ\8cзоваÑ\82Ñ\8c более оÑ\82лиÑ\87аÑ\8eÑ\89ееÑ\81Ñ\8f имÑ\8f?",
"fileexists-thumbnail-yes": "Файл, вероятно, является уменьшенной копией (миниатюрой). [[$1|thumb]]\nПожалуйста, проверьте файл <strong>[[:$1]]</strong>.\nЕсли указанный файл является тем же изображением, не стоит загружать отдельно его уменьшенную копию.",
"file-thumbnail-no": "Название файла начинается с <strong>$1</strong>.\nВероятно, это уменьшенная копия изображения ''(миниатюра)''.\nЕсли у вас есть данное изображение в полном размере, пожалуйста, загрузите его или измените имя файла.",
"fileexists-forbidden": "Файл с этим именем уже существует и не может быть перезаписан.\nЕсли всё равно хотите загрузить данный файл, пожалуйста, вернитесь назад и загрузите его под другим именем. [[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "Удаление и восстановление файлов временно отключены на время технических работ.",
"filedelete-maintenance-title": "Не удаётся удалить файл",
"mimesearch": "Поиск по MIME",
- "mimesearch-summary": "Эта страница позволяет отбирать файлы по их MIME-типу. Формат ввода: типсодержимого/подтип, например <code>image/jpeg</code>.",
+ "mimesearch-summary": "Эта страница позволяет фильтровать файлы по их MIME-типу. Формат ввода: типсодержимого/подтип или типсодержимого/*, например <code>image/jpeg</code>.",
"mimetype": "MIME-тип:",
"download": "загрузить",
"unwatchedpages": "Страницы, за которыми никто не следит",
"wantedtemplates": "Требуемые шаблоны",
"mostlinked": "Страницы, на которые больше всего ссылок",
"mostlinkedcategories": "Категории, на которые больше всего ссылок",
- "mostlinkedtemplates": "Самые используемые шаблоны",
+ "mostlinkedtemplates": "Самые частовключаемые страницы",
"mostcategories": "Страницы, включённые в большое количество категорий",
"mostimages": "Самые используемые файлы",
"mostinterwikis": "Страницы с наибольшим числом интервики-ссылок",
"tooltip-summary": "Введите краткое описание",
"interlanguage-link-title": "$1 — $2",
"common.css": "/* Размещённый здесь CSS будет применяться ко всем темам оформления */",
- "monobook.css": "/* Размещённый здесь CSS будет применяться к теме оформления Monobook */",
- "vector.css": "/* Размещённый здесь CSS будет применяться к векторной теме оформления */",
"print.css": "/* Размещённый здесь CSS будет применяться к версии для печати */",
"noscript.css": "/* Размещённый здесь CSS будет применяться для участников с отключенным JavaScript */",
"group-autoconfirmed.css": "/* Размещённый здесь CSS будет применяться для автоподтверждённых участников */",
"group-sysop.css": "/* Размещённый здесь CSS будет применяться только для администраторов */",
"group-bureaucrat.css": "/* Размещённый здесь CSS будет применяться только для бюрократов */",
"common.js": "/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */",
- "monobook.js": "/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления MonoBook */",
- "vector.js": "/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Vector */",
"group-autoconfirmed.js": "/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус автоподтверждённых (autoconfirmed) */",
"group-bot.js": "/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус ботов (bots) */",
"group-sysop.js": "/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус администраторов (sysops) */",
"pageinfo-category-pages": "Количество страниц",
"pageinfo-category-subcats": "Количество подкатегорий",
"pageinfo-category-files": "Количество файлов",
- "skinname-vector": "Векторное",
"markaspatrolleddiff": "Отметить как проверенную",
"markaspatrolledtext": "Отметить эту статью как проверенную",
"markedaspatrolled": "Отмечена как проверенная",
"qbmyoptions": "Мин сирэйдэрим",
"faq": "FAQ",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Тиэмэ эбии",
- "vector-action-delete": "Сот",
- "vector-action-move": "Аатын уларыт",
- "vector-action-protect": "Уларыйбат гын",
- "vector-action-undelete": "Төннөр",
- "vector-action-unprotect": "Көмүскэлин уларыт",
- "vector-view-create": "Ай",
- "vector-view-edit": "Уларыт",
- "vector-view-history": "Устуоруйатын көрүү",
- "vector-view-view": "Ааҕыы",
- "vector-view-viewsource": "Бэлиэлэрин көрүү",
"actions": "Дьайыылар",
"namespaces": "Аат даллара",
"variants": "Барыллар",
"difference-missing-revision": "$2 барыл бу тэҥнээһиҥҥэ ($1) көстүбэтэ.\n\nБу үксүн хайыы-үйэ сотуллубут сирэйи кытта тэҥнээри эргэрбит сигэнэн кэллэххэ баар буолааччы.\nСиһилии баҕар [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} сотуу сурунаалыгар] баара буолуо.",
"searchresults": "Булулунна",
"searchresults-title": "Көрдөөһүн түмүгэ \"$1\"",
- "toomanymatches": "Наһаа элбэх ыйытыы төнүннэ, бука диэн атыннык көрдөө",
"titlematches": "Ыстатыйалар ааттара хоһулаһар",
"textmatches": "Ыстатыйалар истэрэ хатыланар",
"notextmatches": "Ыстатыйалар истэрэ хатыламмат",
"tooltip-preferences-save": "Туруоруулары бигэргэт",
"tooltip-summary": "Кылгастык бу туһунан суруй",
"common.css": "/** Манна оҥоһуллубут CSS атын скиннарга эмиэ олохтонуо */",
- "monobook.css": "/* Манна оҥоһуллубут CSS Monobook диэн скиҥҥа туһаныллыа */",
"common.js": "/* Оҥоһуллубут JavaScript ханнык баҕарар киһи манна киирдэҕинэ үлэлээн кэлиэ. */",
- "monobook.js": "/* Эргэрбит; маны туһан:[[MediaWiki:common.js]] */",
"anonymous": "{{SITENAME}} ааттамматах {{PLURAL:$1|кыттааччыта|кыттааччылара}}",
"siteuser": "{{SITENAME}} кыттааччыта $1",
"anonuser": "{{SITENAME}} бэйэтин билиһиннэрбэтэх кыттааччыта $1",
"qbmyoptions": "Li mè pàggini",
"faq": "Dumanni cumuni",
"faqpage": "Project:Dumanni comuni",
- "vector-action-addsection": "Agghiunci argumentu",
- "vector-action-delete": "Elìmina",
- "vector-action-move": "Sposta",
- "vector-action-protect": "Pruteggi",
- "vector-action-undelete": "Riprìstina",
- "vector-action-unprotect": "Cancia la prutizzioni",
- "vector-view-create": "Crea",
- "vector-view-edit": "Cancia",
- "vector-view-history": "Talìa a storia",
- "vector-view-view": "Leggi",
- "vector-view-viewsource": "Talìa la fonti",
"actions": "Azzioni",
- "vector-more-actions": "Àutri cosi",
"namespaces": "Namespace",
"variants": "Varianti",
"navigation-heading": "Menù di navigazzioni",
"userlogin-resetpassword-link": "Reinizzializza la tò password",
"userlogin-helplink2": "Aiutu pâ trasuta",
"userlogin-loggedin": "Vossia già trasìu comu {{GENDER:$1|$1}}.\nUsassi lu mòdulu ccassutta pi tràsiri comu autru utenti.",
+ "userlogin-createanother": "Crèa n'autru cuntu",
"createacct-emailrequired": "Nnirizzu e-mail",
"createacct-emailoptional": "Nnirizzu e-mail (facurtativu)",
"createacct-email-ph": "Nzirisci lu tò nnirizzu e-mail",
"createacct-captcha": "Cuntrollu di sicurezza",
"createacct-imgcaptcha-ph": "Nzirìsci lu testu ca vidi ccassupra",
"createacct-submit": "Crèa nu cuntu",
+ "createacct-another-submit": "Crèa n'autru cuntu",
"createacct-benefit-heading": "{{SITENAME}} è fatta di pirsuni comu a tìa.",
"createacct-benefit-body1": "{{PLURAL:$1|cuntribbutu|cuntribbuti}}",
"createacct-benefit-body2": "{{PLURAL:$1|pàggina|pàggini}}",
"editundo": "annulla",
"searchresults": "Risurtati dâ circata",
"searchresults-title": "Risurtati dâ circata di \"$1\"",
- "toomanymatches": "Troppi currispunnenzi. Cancia la richiesta.",
"titlematches": "Ntê tìtuli di l'artìculi",
"textmatches": "Ntô testu di l'artìculi",
"notextmatches": "Nudda currispunnenza ntô testu dî pàggini",
"tooltip-preferences-save": "Sarva prifirenzi",
"tooltip-summary": "Nsiriri na sintisi curta",
"common.css": "/* Li stili CSS nziriti ccà s'àpplicanu a tutti li skin */",
- "monobook.css": "/* Li stili CSS nziriti ccà s'àpplicanu a l'utenti chi usanu la skin Monobook */",
"common.js": "/* Lu còdici JavaScript nziritu ccà veni carricatu di ognuna pàggina, pi tutti l'utenti. */",
- "monobook.js": "/* Lu còdici JavaScript nzirutu ccà veni carricatu di l'utenti c'ùsanu la skin MonoBook */",
"anonymous": "{{PLURAL:$1|Utenti anònimu|Utenti anònimi}} di {{SITENAME}}",
"siteuser": "$1, utenti di {{SITENAME}}",
"lastmodifiedatby": "Sta pàggina hà statu canciata pi l'ùrtima vota lu $2, $1 di $3.",
"spam_reverting": "Ripristinata l'ùrtima virsioni priva di culligamenti a $1",
"spam_blanking": "Pàggina svacantata, tutti li virsioni cuntinìanu culligamenti a $1",
"pageinfo-toolboxlink": "Nfurmazzioni ncapu la pàggina",
- "skinname-monobook": "MonoBook",
"markaspatrolleddiff": "Segna lu canciamentu comu virificatu",
"markaspatrolledtext": "Segna sta pàggina comu virificata",
"markedaspatrolled": "Canciamentu virificatu",
"Ushanka",
"sco.wikipedia.org editors",
"לערי ריינהארט",
- "아라"
+ "아라",
+ "PiRSquared17"
]
},
"tog-underline": "Unnerline airtins:",
"qbmyoptions": "Ma pages",
"faq": "ASS",
"faqpage": "Project:ASS",
- "vector-action-addsection": "Eik topic",
- "vector-action-delete": "Delyte",
- "vector-action-move": "Muiv",
- "vector-action-protect": "Fend",
- "vector-action-undelete": "Ondelyte",
- "vector-action-unprotect": "Chynge protection",
- "vector-view-create": "Ceaut",
- "vector-view-edit": "Eedit",
- "vector-view-history": "See histerie",
- "vector-view-view": "Read",
- "vector-view-viewsource": "See Soorce",
"actions": "Actions",
"namespaces": "Namespaces",
"variants": "Variants",
"newarticle": "(New)",
"newarticletext": "Ye'v follaed aen airtin til ae page that disna exeest yet. Tae cræft the page, stairt typin in the kist ablo (see the [$1 heelp page] fer mair info). Gif ye'r here bi mistak, jist clap yer brouser's <strong>back</strong> button.",
"anontalkpagetext": "----\n<em>This is the discussion page fer aen anonymoos uiser that's naw cræftit aen accoont yet, or that disna uise it.</em>\nWe maun therefore uise the numerical IP address tae identifie him/her.\nSic aen IP address can be shaired bi several uisers.\nGif ye'r aen anonymos uiser n feel that onreelavant comments hae been directed at ye, please [[Special:UserLogin/signup|cræft aen accoont]] or [[Special:UserLogin|log in]] tae avoid futur confusion wi ither anonymoos uisers.",
- "noarticletext": "Thaur's naw tex oan this page the nou. \nYe can [[Special:Search/{{PAGENAME}}|rake fer this page teitle]] in ither pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rake the related logs],\n or [{{fullurl:{{FULLPAGENAME}}|action=edit}} eidit this page].</span>",
+ "noarticletext": "Thaur's naw tex oan this page the nou. \nYe can [[Special:Search/{{PAGENAME}}|rake fer this page teitle]] in ither pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rake the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} eidit this page].</span>",
"noarticletext-nopermission": "Thaur's nae tex in this page the nou.\nYe can [[Special:Search/{{PAGENAME}}|rake fer this page title]] in ither pages, or <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rake the relatit logs]</span>, but ye dinna hae permeession tae cræft this page.",
"missing-revision": "The reveesion #$1 o the page named \"{{FULLPAGENAME}}\" disna exeest.\n\nThis is uissuallie caused bi follaein aen ootdated histerie airtin til ae page that haes been delytit.\nDetails can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].",
"userpage-userdoesnotexist": "Uiser accoont \"<nowiki>$1</nowiki>\" hasnae been registerit. Please check gin ye wint tae mak or eidit this page.",
"mergehistory-empty": "Naw reveesions can be merged.",
"mergehistory-success": "$3 {{PLURAL:$3|reveesion|reveesions}} o [[:$1]] successfully merged intil [[:$2]].",
"mergehistory-fail": "Onable tae perform histerie merge, please recheck the page n time parameters.",
+ "mergehistory-fail-toobig": "Canna perform histerie merge cause mair than the leemit o $1 {{PLURAL:$1|reveesion|reveesions}} wid be muivit.",
"mergehistory-no-source": "Soorce page $1 disna exeest.",
"mergehistory-no-destination": "Destination page $1 disna exeest.",
"mergehistory-invalid-source": "Soorce page maun be ae valid title.",
"difference-missing-revision": "{{PLURAL:$2|Yin reveesion|$2 reveesions}} o this difference ($1) {{PLURAL:$2|wis|were}} na foond.\n\nThis is usuallie caused bi follaein aen ootdated diff airtin til ae page that's been delytit.\nDetails can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].",
"searchresults": "Rake ootcomes",
"searchresults-title": "Rake ootcome fer \"$1\"",
- "toomanymatches": "Ower moni matches were returned, please try ae different speirin",
"titlematches": "Page teetle matches",
"textmatches": "Page tex matches",
"notextmatches": "Nae page tex matches",
"recentchanges-label-bot": "This eedit wis performed bi ae bot",
"recentchanges-label-unpatrolled": "This eedit haes no bin patrolled yet",
"recentchanges-label-plusminus": "The page size chynged bi this nummer o bytes",
- "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (see [[Special:NewPages|leet o new pages]] ava)",
+ "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (see [[Special:NewPages|leet o new pages]] n aw)",
"rcnotefrom": "Ablo ar the chynges sin <strong>$2</strong> (up til <strong>$1</strong> shawn).",
"rclistfrom": "Shaw new chynges stertin fae $3 $2",
"rcshowhideminor": "$1 smaa eedits",
"windows-nonascii-filename": "This wiki disna support filenames wi speecial chairacters.",
"fileexists": "Ae file wi this name exeests aareadies, please check <strong>[[:$1]]</strong> gif ye'r no sair that ye want tae chynge it.\n[[$1|thumb]]",
"filepageexists": "The descreeption page fer this file haes awreadie been cræftit at <strong>[[:$1]]</strong>, bit nae file wi this name exeests the nou.\nThe ootline that ye enter will na kith oan the descreeption page.\nTae mak yer ootline kith thaur, ye'll need tae manuallie eedit it.\n[[$1|thumb]]",
- "fileexists-extension": "Ae file wi ae siclike name exeests: [[$2|thumb]]\n* Name o the uplaidin file: <strong>[[:$1]]</strong>\n* Name o the exeestin file: <strong>[[:$2]]</strong>\nPlease chuise ae different name.",
+ "fileexists-extension": "Ae file wi ae siclike name exeests: [[$2|thumb]]\n* Name o the uplaidin file: <strong>[[:$1]]</strong>\n* Name o the exeestin file: <strong>[[:$2]]</strong>\nWid ye lik tae chuise ae mair disteencteeve name?",
"fileexists-thumbnail-yes": "The file seems tae be aen eemage o reduced size ''(thumbnail)''.\n[[$1|thumb]]\nPlease check the file <strong>[[:$1]]</strong>.\nGif the checked file is the same eemage o oreeginal size it's no necessairie tae uplaid aen extra thumbnail.",
"file-thumbnail-no": "The filename begins wi <strong>$1</strong>.\nIt seems tae be aen eemage o reduced size ''(thumbnail)''.\nGif ye hae this emage in ful resolution uplaid this yin, itherwise please chynge the filename.",
"fileexists-forbidden": "Ae file wi this name awreadie exists, n canna be owerwritten.\nGif ye still wish tae uplaid yer file, please gang back n uise ae new name.\n[[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "Delytion n restoration o files tempralie disabled during maintenance.",
"filedelete-maintenance-title": "Canna delyte file",
"mimesearch": "MIME rake",
- "mimesearch-summary": "This page enables the filterin o files fer thair MIME type.\nInput: contenttype/subtype, e.g. <code>eemage/jpeg</code>.",
+ "mimesearch-summary": "This page enables the filterin o files fer thair MIME type.\nInput: contenttype/subtype or contenttype/*, e.g. <code>eemage/jpeg</code>.",
"mimetype": "MIME type:",
"download": "dounlaid",
"unwatchedpages": "Onwatched pages",
"version-parser-function-hooks": "Parser function huiks",
"version-hook-name": "Huik name",
"version-hook-subscribedby": "Subscribed bi",
+ "version-no-ext-name": "[no name]",
"version-ext-colheader-description": "Descreeption",
"version-ext-colheader-credits": "Writers",
"version-license-title": "License fer $1",
"qbmyoptions": "Moje opcije",
"faq": "ČPP",
"faqpage": "Project:ČPP",
- "vector-action-addsection": "Dodaj temu",
- "vector-action-delete": "Brisanje",
- "vector-action-move": "Preusmjeri",
- "vector-action-protect": "Zaštiti",
- "vector-action-undelete": "Vrati obrisano",
- "vector-action-unprotect": "Promijeni zaštitu",
- "vector-view-create": "Napravi",
- "vector-view-edit": "Uredi",
- "vector-view-history": "Pregled historije",
- "vector-view-view": "Čitaj",
- "vector-view-viewsource": "Vidi izvor (source)",
"actions": "Akcije",
"namespaces": "Imenski prostori",
"variants": "Varijante",
"difference-missing-revision": "Ne mogu da pronađem {{PLURAL:$2|jednu izmenu|$2 izmene|$2 izmena}} od ove razlike ($1).\n\nOvo se obično dešava kada pratite zastarjelu vezu do stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} evidenciji brisanja].",
"searchresults": "Rezultati pretrage",
"searchresults-title": "Rezultati pretrage za \"$1\"",
- "toomanymatches": "Pronađeno je previše rezultata, molimo pokušajte unijeti konkretniji izraz",
"titlematches": "Naslov članka odgovara",
"textmatches": "Tekst stranice odgovara",
"notextmatches": "Tekst stranice ne odgovara",
"qbmyoptions": "Moje stránky",
"faq": "Často kladené otázky",
"faqpage": "Project:Často kladené otázky",
- "vector-action-addsection": "Pridať tému",
- "vector-action-delete": "Zmazať",
- "vector-action-move": "Presunúť",
- "vector-action-protect": "Zamknúť",
- "vector-action-undelete": "Obnoviť",
- "vector-action-unprotect": "Zmeniť stav ochrany",
- "vector-view-create": "Vytvoriť",
- "vector-view-edit": "Upraviť",
- "vector-view-history": "Zobraziť históriu",
- "vector-view-view": "Čítať",
- "vector-view-viewsource": "Zobraziť zdroj",
"actions": "Operácie",
- "vector-more-actions": "Viac",
"namespaces": "Menné priestory",
"variants": "Varianty",
"navigation-heading": "Navigačné menu",
"difference-missing-revision": "{{PLURAL:$2|$2 revízia|$2 revízie|$2 revízií}} pre požadovaný rozdiel ($1) {{PLURAL:$2|neexistuje|neexistujú|neexistuje}}.\n\nPravdepodobne ste nasledovali zastaraný odkaz na rozdiel revízií, z ktorých niektorá bola medzičasom odstránená.\nPodrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zázname zmazaní].",
"searchresults": "Výsledky vyhľadávania",
"searchresults-title": "Výsledky hľadania „$1“",
- "toomanymatches": "Hľadanie vrátilo príliš veľa výsledkov. Prosím, skúste inú požiadavku.",
"titlematches": "Vyhovujúce názvy stránok",
"textmatches": "Zhody v textoch stránok",
"notextmatches": "V textoch stránok nebola nájdená zhoda",
"tooltip-preferences-save": "Uložiť nastavenia",
"tooltip-summary": "Zadajte krátke zhrnutie",
"common.css": "/* Tu umiestnené CSS bude ovplyvňovať všetky štýly */",
- "monobook.css": "/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Monobook */",
- "vector.css": "/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Vector */",
"print.css": "/* Tu umiestnené CSS bude ovplyvňovať tlačový výstup */",
"noscript.css": "/* Tu umiestnené CSS bude ovplyvňovať používateľov s vypnutým JavaScriptom */",
"group-autoconfirmed.css": "/* Tu umiestnené CSS bude ovplyvňovať iba používateľov s overenou emailovou adresou */",
"group-sysop.css": "/* Tu umiestnené CSS bude ovplyvňovať iba správcov */",
"group-bureaucrat.css": "/* Tu umiestnené CSS bude ovplyvňovať iba byrokratov */",
"common.js": "/* Tu uvedený JavaScript sa nahrá všetkým používateľom pri každom nahraní stránky. */",
- "monobook.js": "/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Monobook */",
- "vector.js": "/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Vector */",
"group-autoconfirmed.js": "/* Tu sa nachádzajúci JavaScript sa načíta používateľom s potvrdenou emailovou adresou */",
"group-bot.js": "/* Tu sa nachádzajúci JavaScript sa načíta len robotom */",
"group-sysop.js": "/* Tu sa nachádzajúci JavaScript sa načíta len správcom */",
"pageinfo-category-pages": "Počet stránok",
"pageinfo-category-subcats": "Počet podkategórií",
"pageinfo-category-files": "Počet súborov",
- "skinname-monobook": "MonoBook",
- "skinname-vector": "Vector",
"markaspatrolleddiff": "Označiť ako stráženú",
"markaspatrolledtext": "Označiť túto stránku ako stráženú",
"markedaspatrolled": "Označené ako strážené",
"qbmyoptions": "Moje strani",
"faq": "Najpogostejša vprašanja",
"faqpage": "Project:Najpogostejša vprašanja",
- "vector-action-addsection": "Dodaj temo",
- "vector-action-delete": "Izbriši",
- "vector-action-move": "Prestavi",
- "vector-action-protect": "Zaščiti",
- "vector-action-undelete": "Vrni",
- "vector-action-unprotect": "Spremeni zaščito",
- "vector-view-create": "Ustvari",
- "vector-view-edit": "Uredi",
- "vector-view-history": "Zgodovina",
- "vector-view-view": "Preberi",
- "vector-view-viewsource": "Izvorno besedilo",
"actions": "Dejanja",
- "vector-more-actions": "Več",
"namespaces": "Imenski prostori",
"variants": "Različice",
"navigation-heading": "Navigacijski meni",
"copyrightwarning": "Vsi prispevki k {{GRAMMAR:dajalnik|{{SITENAME}}}} se obravnavajo kot objave pod pogoji $2 (za podrobnosti glej $1). Če niste pripravljeni na neusmiljeno urejanje in prosto razširjanje vašega gradiva, ga ne prispevajte.<br />\nPoleg tega zagotavljate, da ste prispevke napisali oziroma ustvarili sami ali pa prepisali iz javno dostopnega ali podobnega prostega vira.\n'''Ne dodajajte avtorsko zaščitenega dela brez dovoljenja!'''",
"copyrightwarning2": "Vedite, da lahko drugi urejevalci urejajo, spremenijo ali odstranijo kateri koli prispevek k {{GRAMMAR:dajalnik|{{SITENAME}}}}.\nČe niste pripravljeni na neusmiljeno urejanje svojega gradiva, ga ne objavljajte tukaj.<br />\nPoleg tega jamčite, da ste prispevke napisali oziroma ustvarili sami ali pa prepisali iz vira v javni lasti ali podobnega prostega vira (za podrobnosti glej $1).\n'''Ne objavljajte avtorsko zaščitenega gradiva brez dovoljenja!'''",
"longpageerror": "'''Napaka: Predloženo besedilo je dolgo $1 {{PLURAL:$1|kilobajt|kilobajta|kilobajte|kilobajtov}}, s čimer presega največjo dovoljeno dolžino $2 {{PLURAL:$2|kilobajta|kilobajtov|kilobajtov|kilobajtov}}.'''\nZato ga ni mogoče shraniti.",
- "readonlywarning": "'''Opozorilo: Zbirka podatkov je zaradi vzdrževanja začasno zaklenjena, kar pomeni, da sprememb trenutno ne morete shraniti. Prosimo, prenesite besedilo v urejevalnik in ga dodajte pozneje.'''\n\nSistemski skrbnik, ki jo je zaklenil, je podal naslednjo razlago: $1",
+ "readonlywarning": "<strong>Opozorilo: Zbirka podatkov je zaradi vzdrževanja začasno zaklenjena, kar pomeni, da sprememb trenutno ne morete shraniti.</strong>\nProsimo, prenesite besedilo v urejevalnik in ga dodajte pozneje.\n\nSistemski skrbnik, ki jo je zaklenil, je podal naslednjo razlago: $1",
"protectedpagewarning": "'''Opozorilo: Stran je bila zaklenjena in jo lahko urejajo le uporabniki z administratorskimi pravicami.'''\nZadnji vnos v dnevnik je naveden spodaj:",
"semiprotectedpagewarning": "'''Opomba:''' Stran je bila zaklenjena in jo lahko urejajo le registrirani uporabniki.\nZadnji vnos v dnevnik je naveden spodaj:",
"cascadeprotectedwarning": "'''Opozorilo:''' Ta stran je zaklenjena, tako da jo lahko urejajo le administratorji, saj je bila vključena med {{PLURAL:$1|sledečo stran|sledeči strani|sledeče strani}} s kaskadno zaščito:",
"mergehistory-empty": "Redakcij ni moč združiti.",
"mergehistory-success": "$3 {{PLURAL:$3|redakcija|redakciji|redakcije|redakcij}} [[:$1]] je uspešno spojenih v [[:$2]].",
"mergehistory-fail": "Ne morem izvesti združitev zgodovine, prosimo, ponovno preverite strani in parametre časa.",
+ "mergehistory-fail-toobig": "Ne morem izvesti združitve zgodovine, saj bi moral premakniti več kot $1 {{PLURAL:$1|redakcijo|redakciji|redakcije|redakcij}}, kar je omejitev.",
"mergehistory-no-source": "Izvirna stran $1 ne obstaja.",
"mergehistory-no-destination": "Ciljna stran $1 ne obstaja.",
"mergehistory-invalid-source": "Izhodiščna stran mora imeti veljaven naslov.",
"difference-missing-revision": "{{PLURAL:$2|Ene redakcije|$2 redakcij}} razlike ($1) {{PLURAL:$2|nisem}} našel.\n\nPo navadi se to zgodi, ko sledite zastareli povezavi na razliko redakcij strani, ki jo je nekdo izbrisal.\nPodrobnosti lahko najdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].",
"searchresults": "Izid iskanja",
"searchresults-title": "Zadetki za povpraševanje »$1«",
- "toomanymatches": "Vrnjenih je bilo preveč zadetkov, poskusite z drugačno poizvedbo",
"titlematches": "Ujemanje z naslovom članka",
"textmatches": "Ujemanje z besedilom članka",
"notextmatches": "Iskanih besed ne vsebuje nobeno besedilo članka",
"largefileserver": "Velikost datoteke presega strežnikove nastavitve.",
"emptyfile": "Kaže, da je aložena datoteka prazna.\nDo tega bi lahko prišlo zaradi tipkarske napake v imenu.\nAli datoteko resnično želite naložiti?",
"windows-nonascii-filename": "Ta wiki ne podpira imen datotek s posebnimi znaki.",
- "fileexists": "Datoteka s tem imenom že obstaja. Preden jo povozite, preverite stran <strong>[[:$1]]</strong>.\n[[$1|thumb]]",
+ "fileexists": "Datoteka s tem imenom že obstaja. Preden jo {{GENDER:|povozite}}, preverite stran <strong>[[:$1]]</strong>.\n[[$1|thumb]]",
"filepageexists": "Opisna stran za to datoteko je bila že ustvarjena na <strong>[[:$1]]</strong>, vendar datoteka s tem imenom trenutno ne obstaja.\nPovzetek, ki ste ga vnesli, se ne bo prikazal na opisni strani.\nDa tam prikažete povzetek, morate stran urediti ročno.\n[[$1|thumb]]",
- "fileexists-extension": "Datoteka s podobnim imenom že obstaja: [[$2|thumb]]\n* Ime naložene datoteke: <strong>[[:$1]]</strong>\n* Ime obstoječe datoteke: <strong>[[:$2]]</strong>\nProsimo, izberite drugo ime.",
+ "fileexists-extension": "Datoteka s podobnim imenom že obstaja: [[$2|thumb]]\n* Ime naložene datoteke: <strong>[[:$1]]</strong>\n* Ime obstoječe datoteke: <strong>[[:$2]]</strong>\nŽelite morda uporabiti bolj opisno ime?",
"fileexists-thumbnail-yes": "Kot izgleda, je ta slika pomanjšana ''(thumbnail)''. [[$1|thumb]]\nProsimo, preverite datoteko <strong>[[:$1]]</strong>.\nČe je preverjena datoteka enaka kot ta, ki jo nalage, ni potrebno nalagati še dodatne sličice.",
"file-thumbnail-no": "Ime datoteke se začne z <strong>$1</strong>.\nIzgleda, da je to pomanjšana slika ''(thumbnail)''.\nČe imate sliko polne resolucije, jo naložite, drugače spremenite ime datoteke.",
"fileexists-forbidden": "Datoteka s tem imenom že obstaja in je ni mogoče prepisati.\nČe še vedno želite naložiti vašo datoteko, se prosimo vrnite nazaj in uporabite novo ime.\n[[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "Brisanje in obnovitev datotek je začasno onemogočeno zaradi vzdrževanja.",
"filedelete-maintenance-title": "Ne morem izbrisati datoteke",
"mimesearch": "Iskanje po vrsti MIME",
- "mimesearch-summary": "Ta stran omogoča filtriranje datotek po njihovi vrsti MIME.\nVnesite: vrstavsebine/podvrsta, npr. <code>image/jpeg</code>.",
+ "mimesearch-summary": "Stran omogoča filtriranje datotek po njihovi vrsti MIME.\nVnesite: vrstavsebine/podvrsta ali vrstavsebine/*, npr. <code>image/jpeg</code>.",
"mimetype": "Vrsta MIME:",
"download": "prenesi",
"unwatchedpages": "Nespremljane strani",
"version-hook-name": "Ime razširitve",
"version-hook-subscribedby": "Naročen s strani",
"version-version": "(Različica $1)",
+ "version-no-ext-name": "[brez imena]",
"version-license": "Dovoljenje MediaWiki",
"version-ext-license": "Dovoljenje",
"version-ext-colheader-name": "Razširitev",
"qbmyoptions": "Boggageyga",
"faq": "SIL",
"faqpage": "Project:SIL",
- "vector-action-addsection": "Hadal ku dar",
- "vector-action-delete": "Tirtir",
- "vector-action-move": "Wareeji",
- "vector-action-protect": "Difaac",
- "vector-action-undelete": "Ha tirtirin",
- "vector-action-unprotect": "Bedel difaacida",
- "vector-view-create": "Sameey",
- "vector-view-edit": "Wax ka bedel",
- "vector-view-history": "Itusi taariikhda",
- "vector-view-view": "Akhri",
- "vector-view-viewsource": "Itusi xogta",
"actions": "Waxa dhacaayo",
"namespaces": "Xarun magaceedyada",
"variants": "Isbedelada",
"tog-shownumberswatching": "Trego numrin e përdoruesve që vëzhgojnë këtë faqe",
"tog-oldsig": "Nënshkrimi ekzistues:",
"tog-fancysig": "Mbaje nënshkrimin si wikitekst (pa lidhje automatike)",
- "tog-uselivepreview": "Trego bocetin në mënyrë të drejtëpërdrejtë (kërkon JavaScript) (eksperimentale)",
+ "tog-uselivepreview": "Trego pamjen në mënyrë të drejtëpërdrejtë (kërkon JavaScript) (eksperimentale)",
"tog-forceeditsummary": "Më njofto kur e lë përmbledhjen e redaktimit bosh",
"tog-watchlisthideown": "Fshih redaktimet e mia nga lista e faqeve të vëzhguara",
"tog-watchlisthidebots": "Fshih redaktimet e robotëve nga lista e faqeve të vëzhguara",
"tog-showhiddencats": "Trego kategoritë e fshehura",
"tog-norollbackdiff": "Ndryshimi pas rikthimit do të fshihet",
"tog-useeditwarning": "Më paralajmëro kur unë lë një redaktim faqeje me ndryshime të paruajtura",
+ "tog-prefershttps": "Gjithmonë përdorni një lidhje të sigurt kur të kyçur",
"underline-always": "Gjithmonë",
"underline-never": "Asnjëherë",
"underline-default": "Parapërcaktuar nga shfletuesi",
"newwindow": "(hapet në një dritare të re)",
"cancel": "Anulo",
"moredotdotdot": "Më shumë...",
- "morenotlisted": "Të tjera...",
+ "morenotlisted": "Kjo listë nuk është e plotë.",
"mypage": "Faqja",
"mytalk": "Diskutimet",
"anontalk": "Diskutimet për këtë IP",
"qbmyoptions": "Faqet e mia",
"faq": "Pyetje që bëhen shpesh",
"faqpage": "Project: Pyetje që bëhen shpesh",
- "vector-action-addsection": "Shto një temë",
- "vector-action-delete": "Grise",
- "vector-action-move": "Zhvendose",
- "vector-action-protect": "Mbroje",
- "vector-action-undelete": "Anullo fshirjen",
- "vector-action-unprotect": "Ndrysho mbrojtjen",
- "vector-view-create": "Krijo",
- "vector-view-edit": "Redakto",
- "vector-view-history": "Shiko historikun",
- "vector-view-view": "Lexo",
- "vector-view-viewsource": "Shiko tekstin",
"actions": "Veprimet",
"namespaces": "Hapsirat e emrit",
"variants": "Variante",
"permalink": "Lidhje e përhershme",
"print": "Printo",
"view": "Shiko",
+ "view-foreign": "Pamja <span class=\"notranslate\" translate=\"asnjë\">$1</span>",
"edit": "Redakto",
+ "edit-local": "Modifiko burimin lokalt të përshkrimit",
"create": "Krijo",
+ "create-local": "Shtonipërshkrimin lokal",
"editthispage": "Redakto këtë faqe",
"create-this-page": "Krijoje këtë faqe",
"delete": "Grise",
"jumptonavigation": "lundrim",
"jumptosearch": "kërko",
"view-pool-error": "Ju kërkojmë ndjesë, serverët janë të mbingarkuar për momentin.\nKëtë faqe po përpiqen t'i shikojnë më shumë njerëz nga ç'është e mundur.\nJu lutemi prisni pak para se ta hapni sërish këtë faqe.\n\n$1",
+ "generic-pool-error": "Ju kërkojmë ndjesë, serverët janë të mbingarkuar për momentin.\nKëtë faqe po përpiqen t'i shikojnë më shumë njerëz nga ç'është e mundur.\nJu lutemi prisni pak para se ta hapni sërish këtë faqe.\n\n$1",
"pool-timeout": "Mbaroi koha duke pritur për kyçin",
"pool-queuefull": "Radha e proceseve është mbushur",
"pool-errorunknown": "Gabim i panjohur",
+ "pool-servererror": "Pishinë e numerimit te shërbimit nuk është në dispozicion (<span class=\"notranslate\" translate=\"asnjë\">$1</span>).",
"aboutsite": "Rreth {{SITENAME}}",
"aboutpage": "Project:Rreth",
- "copyright": "Përmbajtja është në disponim nëpërmjet licencës $1.",
+ "copyright": "Përmbajtja është në disponim nëpërmjet licencës $1 ose tregohet ndryshe.",
"copyrightpage": "{{ns:project}}:Të drejtat e autorit",
"currentevents": "Ngjarjet aktuale",
"currentevents-url": "Project:Ngjarjet aktuale",
"nospecialpagetext": "<strong>Ju keni kërkuar një faqe speciale të pavlefshme.</strong> \n\n Një listë e faqeve speciale të vlefshme mund të gjendet në [[Special:SpecialPages|{{int: specialpages }}]].",
"error": "Gabim",
"databaseerror": "Gabim në databazë",
+ "databaseerror-text": "\nKjo mund të tregojë një gabim në software.",
+ "databaseerror-textcl": " ka ndodhur një gabim ne query te bazën të dhënash",
+ "databaseerror-query": "\nPyetje: $ 1",
+ "databaseerror-function": "Funksioni: <span class=\"notranslate\" translate=\"asnjë\">$1</span>",
+ "databaseerror-error": "Gabim: <span class=\"notranslate\" translate=\"asnjë\">$1</span>",
"laggedslavemode": "'''Kujdes:''' Kjo faqe nuk mund të ketë përditësime të kohëve të fundit.",
"readonly": "Databaza e kyçur",
"enterlockreason": "Shëno arsyen e kyçjes, gjithashtu shëno se kur mund të hapet.",
"cannotdelete": "Faqja ose skeda $1 nuk mund të fshihej.\nMund të jetë fshirë nga dikush tjetër.",
"cannotdelete-title": "Faqja \"$1\" nuk mund të fshihet",
"delete-hook-aborted": "Fshirja u anulua nga togëza.\nNuk jipet shpjegim.",
+ "no-null-revision": "I pamundur krijimi rishikimi i ri për faqen bosh \"$ 1\"",
"badtitle": "Titull i pasaktë",
"badtitletext": "Titulli i faqes që kërkuat nuk ishte i saktë, ishte bosh, ose ishte një titull ndër-gjuhësor/inter-wiki me lidhje të pasaktë.\nMund të përmbajë një ose më shumë germa, të cilat nuk mund të përdoren në tituj.",
"perfcached": "nformacioni i mëposhtëm është kopje e ruajtur dhe mund të mos jetë i përditësuar. E shumta {{PLURAL:$1|një rezultat është|$1 rezultate janë}} ruajtur në kopje.",
"viewsource-title": "Shiko tekstin për $1",
"actionthrottled": "Veprim u ndalua",
"actionthrottledtext": "Si masë sigurie anti-spam, është e ndaluar kryerja e shpeshtë e një veprimi brenda një hapësire kohore shumë të shkurtër. Ju kryet shumë herë të njëjtin veprim brenda një kohe shumë të shkurtër.\nJu lutemi, provojeni përsëri pas disa minutash.",
- "protectedpagetext": "Kjo faqe është e mbrojtur dhe nuk mund të redaktohet.",
+ "protectedpagetext": "Kjo faqe është e mbrojtur për të parandaluar redaktimi apo veprime të tjera.",
"viewsourcetext": "Ju mund të shikoni dhe kopjoni tekstin e kësaj faqeje:",
"viewyourtext": "Ju mund të shikoni dhe të kopjoni tekstin e '''ndryshimeve tuaja''' tek kjo faqe:",
"protectedinterface": "Kjo faqe përmban tekstin e dritares së programit, për këtë arsye mbrohet për të shmangur abuzimet.",
"namespaceprotected": "Nuk ju lejohet redaktimi i faqeve në hapsirën '''$1'''.",
"customcssprotected": "Ju nuk keni leje për të redaktuar këtë faqe CSS, sepse ai përmban cilësimet personale tjetër user's.",
"customjsprotected": "Ju nuk keni leje për të redaktuar këtë faqe JavaScript, sepse ai përmban cilësimet personale tjetër user's.",
+ "mycustomcssprotected": "Ju nuk keni leje për të redaktuar këtë faqe CSS.",
+ "mycustomjsprotected": "Ju nuk keni leje për të redaktuar këtë faqe JavaScript .",
+ "myprivateinfoprotected": "Ju nuk keni leje për të redaktuar të dhënat tuaja private.",
+ "mypreferencesprotected": "Ju nuk keni leje për të ndryshuar preferencat tuaja.",
"ns-specialprotected": "Faqet speciale nuk mund të redaktohen.",
"titleprotected": "Ky titull është mbrojtur nga [[User:$1|$1]] dhe nuk mund të krijohet.\nArsyeja e dhënë është ''$2''.",
"filereadonlyerror": "Nuk është në gjendje që të ndryshojë skedarin \"$1\" sepse depoja e skedarit \"$2\" është në formën vetëm-lexim.\n\nAdministratori i cili e mbylli atë e dha këtë shpjegim: \"$3\".",
"invalidtitle-unknownnamespace": "Titull jo i vlefshëm me numrin e panjohur të hapësirës së emrit $1 dhe tekstit \"$2\"",
"exception-nologin": "I paqasur",
"exception-nologin-text": "Kjo faqe ose ky veprim ju kërkon që të qaseni në këtë wiki.",
+ "exception-nologin-text-manual": "Ju lutem <span class=\"notranslate\" translate=\"asnjë\">$1</span> që të jeni në gjendje për të hyrë në këtë faqe ose të veproni.",
"virus-badscanner": "Konfiguracion i parregullt: Skaner i panjohur virusesh: ''$1''",
"virus-scanfailed": "skani dështoi (code $1)",
"virus-unknownscanner": "antivirus i pa njohur:",
- "logouttext": "'''Ju keni dalë jashtë.''' \n\n Ju mund të vazhdoni të përdorni {{SITENAME}} në mënyrë anonime, ose mund të <span class='plainlinks'>[$1 identifikoheni përsëri]</span> si përdoruesi i mëparshëm ose si një përdorues tjetër. \n Kini parasysh që disa faqe mund të shfaqen sikur të ishit i identifikuar derisa të fshini ''cache''-in e shfletuesit tuaj.",
+ "logouttext": "'''Ju keni dalë jashtë.''' \n \n Kini parasysh që disa faqe mund të shfaqen sikur të ishit i identifikuar derisa të fshini ''cache''-in e shfletuesit tuaj.",
"welcomeuser": "Mirë se vini, $1!",
"welcomecreation-msg": "Llogaria juaj u krijua. \nMos harroni të ndryshoni [[Special:Preferences|{{SITENAME}} preferencat]] tuaja.",
"yourname": "Fusni nofkën tuaj",
"gotaccount": "Keni një llogari? '''$1'''.",
"gotaccountlink": "Hyni",
"userlogin-resetlink": "Keni harruar të dhënat tuaja të identifikimit?",
- "userlogin-resetpassword-link": "Rivendos fjalëkalimin",
- "createaccountmail": "me email",
+ "userlogin-resetpassword-link": "Harruat fjalëkalimin",
+ "userlogin-helplink2": "Ndihmoni me hyrjen në",
+ "userlogin-loggedin": "Ju tashmë janë të regjistruar si <span class=\"notranslate\" translate=\"asnjë\">{{GJINIA:$1|</span><span class=\"notranslate\" translate=\"asnjë\">$1</span>}}.\nPërdorim formularin më poshtë që të hyni në si një përdorues tjetër.",
+ "userlogin-createanother": "Krijo një llogari tjeter",
+ "createacct-emailrequired": "Posta elektronike",
+ "createacct-emailoptional": "Adresa Elektronike (me dëshirë)",
+ "createacct-email-ph": "Fusni adresën tuaj elektronike",
+ "createacct-another-email-ph": "Vendos adresën e postës elektronike",
+ "createaccountmail": "Përdorni një fjalëkalim të përkohshëm të rastit dhe dërgojeni atë në adresën e specifikuar te email",
+ "createacct-realname": "Emri i vërtetë (me dëshirë)",
"createaccountreason": "Arsyeja:",
+ "createacct-reason": "Arsyeja",
+ "createacct-reason-ph": "Pse ju jeni duke krijuar një llogari tjetër",
+ "createacct-captcha": "kontroll sigurie",
+ "createacct-imgcaptcha-ph": "Shkruaj tekstin që ju shihni më lartë",
+ "createacct-submit": "Krijoni llogarinë tuaj",
+ "createacct-another-submit": "Krijo një llogari tjeter",
+ "createacct-benefit-heading": "{{SITENAME}} është bërë nga njerëz si ju.",
+ "createacct-benefit-body1": "$1 {{PLURAL:$1|redaktim|redaktime}}",
+ "createacct-benefit-body2": "\n{{Plural: $ 1 | faqe | faqe}}",
"badretype": "Fjalëkalimet nuk janë njësoj.",
"userexists": "Emri i përdoruesit që kërkuat është në përdorim. \nZgjidhni një emër tjetër.",
"loginerror": "Gabim gjatë identifikimit",
"diff-multi-manyusers": "({{PLURAL:$1|Një versioni i ndërmjetshëm|$1 versione të ndërmjetshme}} nga më shumë se $2 {{PLURAL:$2|përdorues|përdorues}} i/të pashfaqur)",
"searchresults": "Rezultatet e kërkimit",
"searchresults-title": "Rezultatet e kërkimit për \"$1\"",
- "toomanymatches": "Ky kërkim ka shumë përfundime, provoni një pyetje tjetër më përcaktuese",
"titlematches": "Tituj faqesh që përputhen",
"textmatches": "Tekst faqesh që përputhet",
"notextmatches": "Nuk ka asnjë tekst faqeje që përputhet",
"searchmenu-exists": "'''Në këtë wiki kjo faqe është emëruar \"[[:$1]]\"'''",
"searchmenu-new": "'''Hapë faqen \"[[:$1]]\" në këtë wiki!'''",
"searchprofile-articles": "Përmbajtja e faqeve",
- "searchprofile-project": "Ndihmë dhe faqet e Projektit",
"searchprofile-images": "Multimedia",
"searchprofile-everything": "Gjithçka",
"searchprofile-advanced": "Avancuar",
"searchprofile-articles-tooltip": "Kërko në $1",
- "searchprofile-project-tooltip": "Kërko në $1",
"searchprofile-images-tooltip": "Kërko skedarë",
"searchprofile-everything-tooltip": "Kërko gjithë përmbajtjen (duke përfshirë edhe faqet e diskutimit)",
"searchprofile-advanced-tooltip": "Kërkimi në hapësina",
"search-interwiki-default": "$1 përfundime:",
"search-interwiki-more": "(më shumë)",
"search-relatedarticle": "Të ngjashme",
- "searcheverything-enable": "Kërko në të gjitha hapësirat",
"searchrelated": "të ngjashme",
"searchall": "të gjitha",
"showingresults": "Më poshtë tregohen {{PLURAL:$1|'''1''' përfundim|'''$1''' përfundime}} duke filluar nga #'''$2'''.",
"allowemail": "Lejo përdoruesit të më dërgojnë email",
"prefs-searchoptions": "Mundësi kërkimi",
"prefs-namespaces": "Hapësirat",
- "defaultns": "Kërko automatikisht vetëm në këto hapësira:",
"default": "parazgjedhje",
"prefs-files": "Figura",
"prefs-custom-css": "CSS i përpunuem",
"prefs-emailconfirm-label": "Konfirmimi i emailit:",
"youremail": "Adresa e email-it*",
"username": "Nofka e përdoruesit:",
- "uid": "Nr. i identifikimit:",
"prefs-memberingroups": "Anëtar i {{PLURAL:$1|grupit|grupeve}}:",
"prefs-registration": "Koha e regjistrimit:",
"yourrealname": "Emri juaj i vërtetë*",
"log-title-wildcard": "Kërko tituj që fillojnë me këtë tekst",
"showhideselectedlogentries": "Paraqit/fshih shënimet e përzgjedhura të regjistruara.",
"allpages": "Të gjitha faqet",
- "alphaindexline": "$1 deri në $2",
"nextpage": "Faqja më pas ($1)",
"prevpage": "Faqja më parë ($1)",
"allpagesfrom": "Trego faqet duke filluar nga:",
"tooltip-undo": "\"Zhbëje\" rikthen këtë ndryshim dhe hap modulin e redaktimit për shqyrtim. Lejon që të jepni një arsye tek përmbledhja.",
"tooltip-preferences-save": "Ruaj parapëlqimet",
"tooltip-summary": "Fusni një përmbledhje të shkurtër",
- "monobook.css": "/* redaktoni këtë faqe për të përshtatur pamjen Monobook për tëra faqet tuaja */",
+ "interlanguage-link-title-nonlang": "$1 deri në $2",
"anonymous": "{{PLURAL:$1|Përdoruesi anonim|Përdoruesit anonimë}} të {{SITENAME}}",
"siteuser": "Përdoruesi $1 nga {{SITENAME}}",
"anonuser": "Përdorues anonim i {{SITENAME}} $1",
"pageinfo-watchers": "Numri i mbikqyrësve",
"pageinfo-edits": "Numri i redaktimeve",
"pageinfo-authors": "Numri i autorëve të veçantë",
- "skinname-cologneblue": "Kolonjë Blu",
"markaspatrolleddiff": "Shënoje si të patrulluar",
"markaspatrolledtext": "Shënoje këtë artikull të patrulluar",
"markedaspatrolled": "Shënoje të patrulluar",
"qbmyoptions": "Моје странице",
"faq": "НПП",
"faqpage": "Project:НПП",
- "vector-action-addsection": "Додај тему",
- "vector-action-delete": "Обриши",
- "vector-action-move": "Премести",
- "vector-action-protect": "Заштити",
- "vector-action-undelete": "Врати",
- "vector-action-unprotect": "Промени заштиту",
- "vector-view-create": "Направи",
- "vector-view-edit": "Уреди",
- "vector-view-history": "Историја",
- "vector-view-view": "Читај",
- "vector-view-viewsource": "Изворни код",
"actions": "Радње",
- "vector-more-actions": "Више",
"namespaces": "Именски простори",
"variants": "Варијанте",
"navigation-heading": "Навигациони мени",
"changeemail-submit": "Промени",
"changeemail-cancel": "Откажи",
"changeemail-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
- "resettokens": "Ресетовање токена",
- "resettokens-no-tokens": "Нема токена за ресетовање.",
- "resettokens-legend": "Ресетовање токена",
- "resettokens-tokens": "Токени:",
+ "resettokens": "Ресетовање жетона",
+ "resettokens-no-tokens": "Нема жетона за ресетовање.",
+ "resettokens-legend": "Ресетовање жетона",
+ "resettokens-tokens": "Ð\96еÑ\82они:",
"resettokens-token-label": "$1 (тренутна вредност: $2)",
- "resettokens-watchlist-token": "Токен за веб довод (Atom/RSS) вашег [[Special:Watchlist|списка надгледања]]",
- "resettokens-done": "Токени су ресетовани",
- "resettokens-resetbutton": "Ресетуј изабране токене",
+ "resettokens-watchlist-token": "Ð\96еÑ\82он за веб довод (Atom/RSS) вашег [[Special:Watchlist|списка надгледања]]",
+ "resettokens-done": "Ð\96еÑ\82они су ресетовани",
+ "resettokens-resetbutton": "Ресетуј изабране жетоне",
"bold_sample": "Подебљан текст",
"bold_tip": "Подебљан текст",
"italic_sample": "Искошени текст",
"accmailtitle": "Лозинка је послата.",
"accmailtext": "Лозинка за {{GENDER:$1|корисника|корисницу}} [[User talk:$1|$1]] је послата на $2. Након пријаве, лозинка се може променити [[Special:ChangePassword|овде]].",
"newarticle": "(нови)",
- "newarticletext": "Ð\94оÑ\88ли Ñ\81Ñ\82е на Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 коÑ\98а Ñ\98оÑ\88 не поÑ\81Ñ\82оÑ\98и.\nÐ\94а биÑ\81Ñ\82е Ñ\98е напÑ\80авили, поÑ\87ниÑ\82е кÑ\83Ñ\86аÑ\82и у прозор испод овог текста (погледајте [$1 страницу за помоћ]).\nАко сте овде дошли грешком, вратите се на претходну страницу.",
+ "newarticletext": "Ð\94оÑ\88ли Ñ\81Ñ\82е на Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 коÑ\98а Ñ\98оÑ\88 не поÑ\81Ñ\82оÑ\98и.\nÐ\94а биÑ\81Ñ\82е Ñ\98е напÑ\80авили, поÑ\87ниÑ\82е да кÑ\83Ñ\86аÑ\82е у прозор испод овог текста (погледајте [$1 страницу за помоћ]).\nАко сте овде дошли грешком, вратите се на претходну страницу.",
"anontalkpagetext": "---- Ово је страница за разговор с анонимним корисником који још нема налог или га не користи.\nЗбог тога морамо да користимо бројчану ИП адресу како бисмо га препознали.\nТакву адресу може делити више корисника.\nАко сте анонимни корисник и мислите да су вам упућене примедбе, [[Special:UserLogin/signup|отворите налог]] или се [[Special:UserLogin|пријавите]] да бисте избегли будућу забуну с осталим анонимним корисницима.",
"noarticletext": "На овој страници тренутно нема садржаја.\nМожете [[Special:Search/{{PAGENAME}}|потражити овај наслов]] на другим страницама,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражити сродне извештаје] или [{{fullurl:{{FULLPAGENAME}}|action=edit}} уредити страницу]</span>.",
"noarticletext-nopermission": "На овој страници тренутно нема садржаја.\nМожете [[Special:Search/{{PAGENAME}}|потражити овај наслов]] на другим страницама или <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражити сродне дневнике]</span>, али немате дозволу да направите ову страницу.",
"copyrightwarning2": "Имајте на уму да се сви доприноси на овом викију могу мењати, враћати или брисати од других корисника.\nАко не желите да се ваши текстови слободно мењају и расподељују, не шаљите их овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву (више на $1).\n'''Не шаљите радове заштићене ауторским правима без дозволе!'''",
"longpageerror": "'''Грешка: текст који сте унели је величине {{PLURAL:$1|један килобајт|$1 килобајта|$1 килобајта}}, што је веће од {{PLURAL:$2|дозвољеног једног килобајта|дозвољена $2 килобајта|дозвољених $2 килобајта}}.'''\nСтраница не може бити сачувана.",
"readonlywarning": "'''Упозорење: база података је закључана ради одржавања, тако да тренутно нећете моћи да сачувате измене.'''\nМожда бисте желели сачувати текст за касније у некој текстуалној датотеци.\n\nАдминистратор који је закључао базу дао је следеће објашњење: $1",
- "protectedpagewarning": "'''Упозорење: ова страница је заштићена, тако да само администратори могу да је мењају.'''\nПоследња ставка у историји је приказана испод:",
+ "protectedpagewarning": "<strong>Упозорење: ова страница је заштићена, тако да само администратори могу да је мењају.</strong>\nПоследњи запис у дневнику је приказан испод:",
"semiprotectedpagewarning": "'''Напомена:''' ова страница је заштићена, тако да само регистровани корисници могу да је уређују.\nПоследњи запис у дневнику је приказан испод:",
"cascadeprotectedwarning": "<strong>Упозорење:</strong> ова страница је заштићена тако да је могу уређивати само администратори, јер је она укључена у {{PLURAL:$1|следећу страницу која је|следеће странице које су}} заштићене „преносивом“ заштитом:",
"titleprotectedwarning": "'''Упозорење: ова страница је заштићена тако да је могу направити само корисници [[Special:ListGroupRights|с одређеним правима]].'''",
"revdelete-selected-text": "{{PLURAL:$1|Изабрана измена|Изабране измене}} [[:$2]]:",
"revdelete-selected-file": "{{PLURAL:$1|Изабрана верзија датотеке|Изабране верзије датотеке}} [[:$2]]:",
"logdelete-selected": "{{PLURAL:$1|Изабрана ставка у историји|Изабране ставке у историји}}:",
+ "revdelete-text-text": "Избрисане измене ће и даље бити видљиве у историји странице, али делови њиховог садржаја неће бити јавно доступну.",
+ "revdelete-text-file": "Избрисане верзије датотеке ће и даље бити видљиве у историји датотеке, али делови њиховог садржаја неће бити јавно доступну.",
+ "logdelete-text": "Избрисани уноси у дневницима ће и даље бити видљиви у дневницима, али делови њиховог садржаја неће бити јавно доступну.",
"revdelete-confirm": "Потврдите да намеравате ово урадити, да разумете последице и да то чините у складу с [[{{MediaWiki:Policy-url}}|правилима]].",
"revdelete-suppress-text": "Сакривање измена би требало користити '''само''' у следећим случајевима:\n* Злонамерни или погрдни подаци\n* Неприкладни лични подаци\n*: ''кућна адреса и број телефона, број банковне картице итд.''",
"revdelete-legend": "Ограничења видљивости",
- "revdelete-hide-text": "Текст ревизије",
+ "revdelete-hide-text": "Текст измене",
"revdelete-hide-image": "Сакриј садржај датотеке",
"revdelete-hide-name": "Сакриј радњу и одредиште",
"revdelete-hide-comment": "Опис измене",
"difference-missing-revision": "Не могу да пронађем {{PLURAL:$2|једну измену|$2 измене|$2 измена}} од ове разлике ($1).\n\nОво се обично дешава када пратите застарелу везу до странице која је обрисана.\nВише информација можете пронаћи у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневнику брисања].",
"searchresults": "Резултати претраге",
"searchresults-title": "Резултати претраге за „$1“",
- "toomanymatches": "Пронађено је превише резултата. Измените упит.",
"titlematches": "Наслов странице одговара",
"textmatches": "Текст странице одговара",
"notextmatches": "Ниједан текст странице не одговара",
"prefs-watchlist-days-max": "Највише $1 {{PLURAL:$1|дан|дана|дана}}",
"prefs-watchlist-edits": "Највећи број измена у проширеном списку надгледања:",
"prefs-watchlist-edits-max": "Највећа вредност је хиљаду",
- "prefs-watchlist-token": "Токен списка надгледања:",
+ "prefs-watchlist-token": "Ð\96еÑ\82он списка надгледања:",
"prefs-misc": "Друга подешавања",
"prefs-resetpass": "Промени лозинку",
"prefs-changeemail": "Промени е-адресу",
"restoreprefs": "Врати све на подразумевано (у свим одељцима)",
"prefs-editing": "Уређивање",
"rows": "Редова:",
- "columns": "Ð\9aолоне:",
+ "columns": "Ð\9aолона",
"searchresultshead": "Претрага",
"stub-threshold": "Праг за обликовање <a href=\"#\" class=\"stub\">везе као клице</a> (у бајтовима):",
"stub-threshold-disabled": "Онемогућено",
"prefs-advancedwatchlist": "Напредне поставке",
"prefs-displayrc": "Поставке приказа",
"prefs-displaywatchlist": "Поставке приказа",
- "prefs-tokenwatchlist": "Токен",
+ "prefs-tokenwatchlist": "Ð\96еÑ\82он",
"prefs-diffs": "Разлике",
"prefs-help-prefershttps": "Ова подешавања ће ступити на снагу при следећој пријави.",
"email-address-validity-valid": "Е-адреса је исправна",
"right-createpage": "прављење страница (изузев страница за разговор)",
"right-createtalk": "прављење страница за разговор",
"right-createaccount": "отварање нових корисничких налога",
- "right-minoredit": "ознаÑ\87аваÑ\9aе измена као маÑ\9aе",
+ "right-minoredit": "ознаÑ\87аваÑ\9aе измена маÑ\9aим",
"right-move": "премештање страница",
"right-move-subpages": "премештање страница с њиховим подстраницама",
"right-move-rootuserpages": "премештање основних корисничких страница",
"right-block": "блокирање даљих измена других корисника",
"right-blockemail": "онемогућавање корисницима да шаљу е-поруке",
"right-hideuser": "блокирање корисничког имена и његово сакривање од јавности",
- "right-ipblock-exempt": "заобилажење блокирања IP адресе, аутоматска блокирања и блокирања опсега",
- "right-proxyunbannable": "заобилажење самоблокирања посредника",
+ "right-ipblock-exempt": "заобилажење блокирања ИП адресе, аутоматска блокирања и блокирања опсега",
+ "right-proxyunbannable": "заобилажење аутоматских блокирања посредника",
"right-unblockself": "одблокирај самог себе",
"right-protect": "промени нивое заштите и уреди странице са преносивом заштитом",
"right-editprotected": "уређивање страница под заштитом „{{int:protect-level-sysop}}“",
"right-edituserjs": "уређивање туђих JavaScript датотека",
"right-editmyusercss": "уређивање сопствених CSS датотека",
"right-editmyuserjs": "уређивање сопствених JavaScript датотека",
- "right-viewmywatchlist": "vidi sopstveni spisak nadgledanja",
+ "right-viewmywatchlist": "види сопствени списак надгледања",
"right-viewmyprivateinfo": "видите своје личне податке (нпр. адресу е-поште, право име)",
"right-editmyprivateinfo": "уређивање сопствених личних података (нпр. адресу е-поште, право име)",
- "right-editmyoptions": "уредите своја подешавања",
+ "right-editmyoptions": "уређивање сопствених подешавања",
"right-rollback": "брзо враћање измена последњег корисника који је мењао одређену страницу",
"right-markbotedits": "означавање враћених измена као измене бота",
"right-noratelimit": "отпорност на ограничења",
"right-import": "увожење страница из других викија",
"right-importupload": "увожење страница из отпремљене датотеке",
"right-patrol": "означавање туђих измена патролираним",
- "right-autopatrol": "аÑ\83Ñ\82омаÑ\82Ñ\81ко ознаÑ\87аваÑ\9aе измена као пÑ\80егледаним",
+ "right-autopatrol": "аÑ\83Ñ\82омаÑ\82Ñ\81ко ознаÑ\87аваÑ\9aе измена паÑ\82Ñ\80олиÑ\80аним",
"right-patrolmarks": "прегледање ознака за патролирање унутар скорашњих измена",
"right-unwatchedpages": "прегледање списка ненадгледаних страница",
"right-mergehistory": "спајање историја страница",
"wantedfiletext-nocat": "Следеће датотеке се користе, али не постоје. Датотеке из других ризница могу бити наведене иако не постоје. Такве датотеке ће бити <del>поништене</del> са списка.",
"wantedtemplates": "Тражени шаблони",
"mostlinked": "Странице с највише веза",
- "mostlinkedcategories": "ЧланÑ\86и Ñ\81 наÑ\98виÑ\88е каÑ\82егоÑ\80иÑ\98а",
+ "mostlinkedcategories": "Ð\9aаÑ\82егоÑ\80иÑ\98е Ñ\81 наÑ\98виÑ\88е веза",
"mostlinkedtemplates": "Шаблони с највише веза",
"mostcategories": "Странице с највише категорија",
"mostimages": "Датотеке с највише веза",
"tooltip-preferences-save": "Сачувај поставке",
"tooltip-summary": "Унесите кратак опис",
"common.css": "/** CSS постављен овде ће се одразити на све теме */",
- "monobook.css": "/* CSS постављен овде ће утицати на све кориснике теме „Монобук“ */",
- "vector.css": "/* CSS постављен овде ће утицати на све кориснике теме „Векторско“ */",
"print.css": "/* CSS постављен овде ће утицати на издање за штампу */",
"noscript.css": "/* CSS постављен овде ће утицати на све кориснике којима је онемогућен јаваскрипт */",
"group-autoconfirmed.css": "/* CSS постављен овде ће утицати на самопотврђене кориснике */",
"group-sysop.css": "/* CSS постављен овде ће утицати само на системске операторе */",
"group-bureaucrat.css": "/* CSS постављен овде ће утицати само на бирократе */",
"common.js": "/* Јаваскрипт постављен овде ће се користити за све кориснике при отварању сваке странице. */",
- "monobook.js": "/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Монобук“ */",
- "vector.js": "/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Векторско“ */",
"group-autoconfirmed.js": "/* Јаваскрипт постављен овде ће се учитати за самопотврђене кориснике */",
"group-bot.js": "/* Јаваскрипт постављен овде ће се учитати само за ботове */",
"group-sysop.js": "/* Јаваскрипт постављен овде ће се учитати само за системске операторе */",
"pageinfo-category-pages": "Број страница",
"pageinfo-category-subcats": "Број поткатегорија",
"pageinfo-category-files": "Број датотека",
- "skinname-monobook": "Монобук",
- "skinname-vector": "Векторско",
"markaspatrolleddiff": "Означи као патролирано",
"markaspatrolledtext": "Означи страницу као патролирану",
"markedaspatrolled": "Означено као патролирано",
"exif-iimsupplementalcategory": "Допунске категорије",
"exif-datetimeexpires": "Не користи након",
"exif-datetimereleased": "Објављено",
- "exif-originaltransmissionref": "Изворни пренос кôда локације",
+ "exif-originaltransmissionref": "Изворни пренос кода локације",
"exif-identifier": "Назнака",
"exif-lens": "Коришћени објектив",
"exif-serialnumber": "Серијски број камере",
"scarytranscludefailed": "[Добављање шаблона за $1 није успело]",
"scarytranscludefailed-httpstatus": "[Не могу да преузмем шаблон $1: HTTP $2]",
"scarytranscludetoolong": "[URL адреса је предугачка]",
- "deletedwhileediting": "'''Упозорење''': ова страница је обрисана након што сте почели с уређивањем!",
+ "deletedwhileediting": "<strong>Упозорење</strong>: ова страница је обрисана након што сте почели с уређивањем!",
"confirmrecreate": "[[User:$1|$1]] ([[User talk:$1|разговор]]) {{GENDER:$1|је обрисао|је обрисала|обриса}} ову страницу након што сте почели да је уређујете из следећег разлога:\n: ''$2''\nПотврдите да стварно желите да направите страницу.",
"confirmrecreate-noreason": "Корисник [[User:$1|$1]] ([[User talk:$1|разговор]]) је обрисао ову страницу након што сте почели да га уређујете. Потврдите да стварно желите да поново направите ову страницу.",
"recreate": "Поново направи",
"watchlistedit-normal-title": "Уређивање списка надгледања",
"watchlistedit-normal-legend": "Уклањање наслова са списка надгледања",
"watchlistedit-normal-explain": "Наслови на вашем списку надгледања су приказани испод.\nДа бисте уклонили наслов, означите кућицу до њега и кликните на „{{int:Watchlistedit-normal-submit}}“.\nМожете и да [[Special:EditWatchlist/raw|уредите сиров списак]].",
- "watchlistedit-normal-submit": "Уклони",
+ "watchlistedit-normal-submit": "Уклони наслове",
"watchlistedit-normal-done": "{{PLURAL:$1|Једна страница је уклоњена|$1 странице су уклоњене|$1 страница је уклоњено}} с вашег списка надгледања:",
"watchlistedit-raw-title": "Измени сиров списак надгледања",
"watchlistedit-raw-legend": "Измени сиров списак надгледања",
"compare-revision-not-exists": "Наведена измена не постоји.",
"dberr-problems": "Дошло је до техничких проблема.",
"dberr-again": "Сачекајте неколико минута и поново учитајте страницу.",
- "dberr-info": "(не могу да се повежем са сервером базе: $1)",
+ "dberr-info": "(не могу да се повежем са сервером базе података: $1)",
+ "dberr-info-hidden": "(не могу да се повежем са сервером базе података)",
"dberr-usegoogle": "У међувремену, покушајте да претражите помоћу Гугла.",
"dberr-outofdate": "Имајте на уму да њихови примерци нашег садржаја могу бити застарели.",
"dberr-cachederror": "Ово је привремено меморисан примерак стране који можда није ажуран.",
"broken-file-category": "Stranice s neispravnim vezama do datoteka",
"about": "O nama",
"article": "Stranica sa sadržajem",
- "newwindow": "(otvara u novom prozoru)",
+ "newwindow": "(otvara se u novom prozoru)",
"cancel": "Otkaži",
"moredotdotdot": "Više…",
"morenotlisted": "Ova lista nije kompletna.",
"qbmyoptions": "Moje stranice",
"faq": "NPP",
"faqpage": "Project:NPP",
- "vector-action-addsection": "Dodaj temu",
- "vector-action-delete": "Obriši",
- "vector-action-move": "Premesti",
- "vector-action-protect": "Zaštiti",
- "vector-action-undelete": "Vrati",
- "vector-action-unprotect": "Promeni zaštitu",
- "vector-view-create": "Napravi",
- "vector-view-edit": "Uredi",
- "vector-view-history": "Istorija",
- "vector-view-view": "Čitaj",
- "vector-view-viewsource": "Izvorni kod",
"actions": "Radnje",
- "vector-more-actions": "Više",
"namespaces": "Imenski prostori",
"variants": "Varijante",
"navigation-heading": "Navigacioni meni",
"changeemail-submit": "Promeni",
"changeemail-cancel": "Otkaži",
"changeemail-throttled": "Previše puta ste pokušali da se prijavite.\nMolimo vas da sačekate $1 pre nego što pokušate ponovo.",
- "resettokens": "Resetovanje tokena",
- "resettokens-no-tokens": "Nema tokena za resetovanje.",
- "resettokens-legend": "Resetovanje tokena",
- "resettokens-tokens": "Tokeni:",
+ "resettokens": "Resetovanje žetona",
+ "resettokens-no-tokens": "Nema žetona za resetovanje.",
+ "resettokens-legend": "Resetovanje žetona",
+ "resettokens-tokens": "Žetoni:",
"resettokens-token-label": "$1 (trenutna vrednost: $2)",
- "resettokens-watchlist-token": "Token za veb dovod (Atom/RSS) vašeg [[Special:Watchlist|spiska nadgledanja]]",
- "resettokens-done": "Tokeni su resetovani",
- "resettokens-resetbutton": "Resetuj izabrane tokene",
+ "resettokens-watchlist-token": "Žeton za veb dovod (Atom/RSS) vašeg [[Special:Watchlist|spiska nadgledanja]]",
+ "resettokens-done": "Žetoni su resetovani",
+ "resettokens-resetbutton": "Resetuj izabrane žetone",
"bold_sample": "Podebljan tekst",
"bold_tip": "Podebljan tekst",
"italic_sample": "Iskošeni tekst",
"accmailtitle": "Lozinka je poslata.",
"accmailtext": "Lozika za {{GENDER:$1|korisnika|korisnicu}} [[User talk:$1|$1]] je poslata na $2. Nakon prijave, lozinka se može promeniti [[Special:ChangePassword|ovde]].",
"newarticle": "(novi)",
- "newarticletext": "Došli ste na stranicu koja još ne postoji.\nDa biste je napravili, počnite kucati u prozor ispod ovog teksta (pogledajte [$1 stranicu za pomoć]).\nAko ste ovde došli greškom, vratite se na prethodnu stranicu.",
+ "newarticletext": "Došli ste na stranicu koja još ne postoji.\nDa biste je napravili, počnite da kucate u prozor ispod ovog teksta (pogledajte [$1 stranicu za pomoć]).\nAko ste ovde došli greškom, vratite se na prethodnu stranicu.",
"anontalkpagetext": "---- Ovo je stranica za razgovor s anonimnim korisnikom koji još nema nalog ili ga ne koristi.\nZbog toga moramo da koristimo brojčanu IP adresu kako bismo ga prepoznali.\nTakvu adresu može deliti više korisnika.\nAko ste anonimni korisnik i mislite da su vam upućene primedbe, [[Special:UserLogin/signup|otvorite nalog]] ili se [[Special:UserLogin|prijavite]] da biste izbegli buduću zabunu s ostalim anonimnim korisnicima.",
"noarticletext": "Na ovoj stranici trenutno nema sadržaja.\nMožete [[Special:Search/{{PAGENAME}}|potražiti ovaj naslov]] na drugim stranicama,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti srodne izveštaje] ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} urediti stranicu]</span>.",
"noarticletext-nopermission": "Na ovoj stranici trenutno nema sadržaja.\nMožete [[Special:Search/{{PAGENAME}}|potražiti ovaj naslov]] na drugim stranicama ili <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti srodne dnevnike]</span>, ali nemate dozvolu da napravite ovu stranicu.",
"copyrightwarning2": "Imajte na umu da se svi doprinosi na ovom vikiju mogu menjati, vraćati ili brisati od drugih korisnika.\nAko ne želite da se vaši tekstovi slobodno menjaju i raspodeljuju, ne šaljite ih ovde.<br />\nIsto tako obećavate da ste vi autor teksta, ili da ste ga umnožili s izvora koji je u javnom vlasništvu (više na $1).\n'''Ne šaljite radove zaštićene autorskim pravima bez dozvole!'''",
"longpageerror": "'''Greška: tekst koji ste uneli je veličine {{PLURAL:$1|jedan kilobajt|$1 kilobajta|$1 kilobajta}}, što je veće od {{PLURAL:$2|dozvoljenog jednog kilobajta|dozvoljena $2 kilobajta|dozvoljenih $2 kilobajta}}.'''\nStranica ne može biti sačuvana.",
"readonlywarning": "<strong>Upozorenje: baza podataka je zaključana radi održavanja, tako da trenutno nećete moći da sačuvate izmene.</strong>\nMožda biste želeli sačuvati tekst za kasnije u nekoj tekstualnoj datoteci.\n\nAdministrator koji je zaključao bazu dao je sledeće objašnjenje: $1",
- "protectedpagewarning": "'''Upozorenje: ova stranica je zaštićena, tako da samo administratori mogu da je menjaju.'''\nPoslednja stavka u istoriji je prikazana ispod:",
+ "protectedpagewarning": "<strong>Upozorenje: ova stranica je zaštićena, tako da samo administratori mogu da je menjaju.</strong>\nPoslednji zapis u dnevniku je prikazan ispod:",
"semiprotectedpagewarning": "'''Napomena:''' ova stranica je zaštićena, tako da samo registrovani korisnici mogu da je uređuju.\nPoslednji zapis u dnevniku je prikazan ispod:",
"cascadeprotectedwarning": "<strong>Upozorenje:</strong> ova stranica je zaštićena tako da je mogu uređivati samo administratori, jer je ona uključena u {{PLURAL:$1|sledeću stranicu koja je|sledeće stranice koje su}} zaštićene „prenosivom“ zaštitom:",
"titleprotectedwarning": "'''Upozorenje: ova stranica je zaštićena tako da je mogu napraviti samo korisnici [[Special:ListGroupRights|s određenim pravima]].'''",
"permissionserrors": "Greška u dozvoli",
"permissionserrorstext": "Nemate ovlašćenje za tu radnju iz {{PLURAL:$1|sledećeg|sledećih}} razloga:",
"permissionserrorstext-withaction": "Nemate dozvolu za $2 iz {{PLURAL:$1|sledećeg|sledećih}} razloga:",
- "recreate-moveddeleted-warn": "'''Upozorenje: ponovo pravite stranicu koja je prethodno obrisana.'''\n\nRazmotrite da li je prikladno da nastavite s uređivanjem ove stranice.\nOvde je navedena istorija brisanja i premeštanja s obrazloženjem:",
+ "recreate-moveddeleted-warn": "<strong>Upozorenje: ponovo pravite stranicu koja je prethodno obrisana.</strong>\n\nRazmotrite da li je prikladno da nastavite s uređivanjem ove stranice.\nOvde je navedena istorija brisanja i premeštanja s obrazloženjem:",
"moveddeleted-notice": "Ova stranica je obrisana.\nIstorija njenog brisanja i premeštanja nalazi se ispod:",
"log-fulllog": "Pogledaj celu istoriju",
"edit-hook-aborted": "Izmenu je prekinula kuka.\nNije dato nikakvo obrazloženje.",
"revdelete-confirm": "Potvrdite da nameravate ovo uraditi, da razumete posledice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
"revdelete-suppress-text": "Sakrivanje izmena bi trebalo koristiti '''samo''' u sledećim slučajevima:\n* Zlonamerni ili pogrdni podaci\n* Neprikladni lični podaci\n*: ''kućna adresa i broj telefona, broj bankovne kartice itd.''",
"revdelete-legend": "Ograničenja vidljivosti",
- "revdelete-hide-text": "Tekst revizije",
+ "revdelete-hide-text": "Tekst izmene",
"revdelete-hide-image": "Sakrij sadržaj datoteke",
"revdelete-hide-name": "Sakrij radnju i odredište",
"revdelete-hide-comment": "Opis izmene",
"difference-missing-revision": "Ne mogu da pronađem {{PLURAL:$2|jednu izmenu|$2 izmene|$2 izmena}} od ove razlike ($1).\n\nOvo se obično dešava kada pratite zastarelu vezu do stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].",
"searchresults": "Rezultati pretrage",
"searchresults-title": "Rezultati pretrage za „$1“",
- "toomanymatches": "Pronađeno je previše rezultata. Izmenite upit.",
"titlematches": "Naslov stranice odgovara",
"textmatches": "Tekst stranice odgovara",
"notextmatches": "Nijedan tekst stranice ne odgovara",
"prefs-watchlist-days-max": "Najviše $1 {{PLURAL:$1|dan|dana|dana}}",
"prefs-watchlist-edits": "Najveći broj izmena u proširenom spisku nadgledanja:",
"prefs-watchlist-edits-max": "Najveća vrednost je hiljadu",
- "prefs-watchlist-token": "Token spiska nadgledanja:",
+ "prefs-watchlist-token": "Žeton spiska nadgledanja:",
"prefs-misc": "Druga podešavanja",
"prefs-resetpass": "Promeni lozinku",
"prefs-changeemail": "Promeni e-adresu",
"restoreprefs": "Vrati sve na podrazumevano (u svim odeljcima)",
"prefs-editing": "Uređivanje",
"rows": "Redova:",
- "columns": "Kolone:",
+ "columns": "Kolona",
"searchresultshead": "Pretraga",
"stub-threshold": "Prag za oblikovanje <a href=\"#\" class=\"stub\">veze kao klice</a> (u bajtovima):",
"stub-threshold-disabled": "Onemogućeno",
"prefs-advancedwatchlist": "Napredne postavke",
"prefs-displayrc": "Postavke prikaza",
"prefs-displaywatchlist": "Postavke prikaza",
+ "prefs-tokenwatchlist": "Žeton",
"prefs-diffs": "Razlike",
"prefs-help-prefershttps": "Ova podešavanja će stupiti na snagu pri sledećoj prijavi.",
"email-address-validity-valid": "E-adresa je ispravna",
"right-createpage": "pravljenje stranica (izuzev stranica za razgovor)",
"right-createtalk": "pravljenje stranica za razgovor",
"right-createaccount": "otvaranje novih korisničkih naloga",
- "right-minoredit": "označavanje izmena kao manje",
+ "right-minoredit": "označavanje izmena manjim",
"right-move": "premeštanje stranica",
"right-move-subpages": "premeštanje stranica s njihovim podstranicama",
"right-move-rootuserpages": "premeštanje osnovnih korisničkih stranica",
"right-blockemail": "onemogućavanje korisnicima da šalju e-poruke",
"right-hideuser": "blokiranje korisničkog imena i njegovo sakrivanje od javnosti",
"right-ipblock-exempt": "zaobilaženje blokiranja IP adrese, automatska blokiranja i blokiranja opsega",
- "right-proxyunbannable": "zaobilaženje samoblokiranja posrednika",
+ "right-proxyunbannable": "zaobilaženje automatskih blokiranja posrednika",
"right-unblockself": "odblokiraj samog sebe",
"right-protect": "promeni nivoe zaštite i uredi stranice sa prenosivom zaštitom",
"right-editprotected": "uređivanje stranice pod zaštitom „{{int:protect-level-sysop}}“",
"right-viewmywatchlist": "vidi sopstveni spisak nadgledanja",
"right-viewmyprivateinfo": "vidite svoje lične podatke (npr. adresu e-pošte, pravo ime)",
"right-editmyprivateinfo": "uređivanje sopstvenih ličnih podataka (npr. adresu e-pošte, pravo ime)",
- "right-editmyoptions": "uredite svoja podešavanja",
+ "right-editmyoptions": "uređivanje sopstvenih podešavanja",
"right-rollback": "brzo vraćanje izmena poslednjeg korisnika koji je menjao određenu stranicu",
"right-markbotedits": "označavanje vraćenih izmena kao izmene bota",
"right-noratelimit": "otpornost na ograničenja",
"right-import": "uvoženje stranica iz drugih vikija",
"right-importupload": "uvoženje stranica iz otpremljene datoteke",
"right-patrol": "označavanje tuđih izmena patroliranim",
- "right-autopatrol": "automatsko označavanje izmena kao pregledanim",
+ "right-autopatrol": "automatsko označavanje izmena patroliranim",
"right-patrolmarks": "pregledanje oznaka za patroliranje unutar skorašnjih izmena",
"right-unwatchedpages": "pregledanje spiska nenadgledanih stranica",
"right-mergehistory": "spajanje istorija stranica",
"wantedfiletext-nocat": "Sledeće datoteke se koriste, ali ne postoje. Datoteke iz drugih riznica mogu biti navedene iako ne postoje. Takve datoteke će biti <del>poništene</del> sa spiska.",
"wantedtemplates": "Traženi šabloni",
"mostlinked": "Stranice s najviše veza",
- "mostlinkedcategories": "Članci s najviše kategorija",
+ "mostlinkedcategories": "Kategorije s najviše veza",
"mostlinkedtemplates": "Šabloni s najviše veza",
"mostcategories": "Stranice s najviše kategorija",
"mostimages": "Datoteke s najviše veza",
"tooltip-preferences-save": "Sačuvaj postavke",
"tooltip-summary": "Unesite kratak opis",
"common.css": "/** CSS postavljen ovde će se odraziti na sve teme */",
- "monobook.css": "/* CSS postavljen ovde će uticati na sve korisnike teme „Monobuk“ */",
- "vector.css": "/* CSS postavljen ovde će uticati na sve korisnike teme „Vektorsko“ */",
"print.css": "/* CSS postavljen ovde će uticati na izdanje za štampu */",
"noscript.css": "/* CSS postavljen ovde će uticati na sve korisnike kojima je onemogućen javaskript */",
"group-autoconfirmed.css": "/* CSS postavljen ovde će uticati na samopotvrđene korisnike */",
"group-sysop.css": "/* CSS postavljen ovde će uticati samo na sistemske operatore */",
"group-bureaucrat.css": "/* CSS postavljen ovde će uticati samo na birokrate */",
"common.js": "/* Javaskript postavljen ovde će se koristiti za sve korisnike pri otvaranju svake stranice. */",
- "monobook.js": "/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Monobuk“ */",
- "vector.js": "/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Vektorsko“ */",
"group-autoconfirmed.js": "/* Javaskript postavljen ovde će se učitati za samopotvrđene korisnike */",
"group-bot.js": "/* Javaskript postavljen ovde će se učitati samo za botove */",
"group-sysop.js": "/* Javaskript postavljen ovde će se učitati samo za sistemske operatore */",
"pageinfo-category-pages": "Broj stranica",
"pageinfo-category-subcats": "Broj potkategorija",
"pageinfo-category-files": "Broj datoteka",
- "skinname-monobook": "Monobuk",
- "skinname-vector": "Vektorsko",
"markaspatrolleddiff": "Označi kao patrolirano",
"markaspatrolledtext": "Označi stranicu kao patroliranu",
"markedaspatrolled": "Označeno kao patrolirano",
"exif-iimsupplementalcategory": "Dopunske kategorije",
"exif-datetimeexpires": "Ne koristi nakon",
"exif-datetimereleased": "Objavljeno",
- "exif-originaltransmissionref": "Izvorni prenos kôda lokacije",
+ "exif-originaltransmissionref": "Izvorni prenos koda lokacije",
"exif-identifier": "Naznaka",
"exif-lens": "Korišćeni objektiv",
"exif-serialnumber": "Serijski broj kamere",
"scarytranscludefailed": "[Dobavljanje šablona za $1 nije uspelo]",
"scarytranscludefailed-httpstatus": "[Ne mogu da preuzmem šablon $1: HTTP $2]",
"scarytranscludetoolong": "[URL adresa je predugačka]",
- "deletedwhileediting": "'''Upozorenje''': ova stranica je obrisana nakon što ste počeli s uređivanjem!",
+ "deletedwhileediting": "<strong>Upozorenje</strong>: ova stranica je obrisana nakon što ste počeli s uređivanjem!",
"confirmrecreate": "[[User:$1|$1]] ([[User talk:$1|razgovor]]) {{GENDER:$1|je obrisao|je obrisala|je obrisao}} ovu stranicu nakon što ste počeli da je uređujete iz sledećeg razloga:\n: ''$2''\nPotvrdite da stvarno želite da napravite stranicu.",
"confirmrecreate-noreason": "Korisnik [[User:$1|$1]] ([[User talk:$1|razgovor]]) je obrisao ovu stranicu nakon što ste počeli da ga uređujete. Potvrdite da stvarno želite da ponovo napravite ovu stranicu.",
"recreate": "Ponovo napravi",
"watchlistedit-normal-title": "Uređivanje spiska nadgledanja",
"watchlistedit-normal-legend": "Uklanjanje naslova sa spiska nadgledanja",
"watchlistedit-normal-explain": "Naslovi na vašem spisku nadgledanja su prikazani ispod.\nDa biste uklonili naslov, označite kućicu do njega i kliknite na „{{int:Watchlistedit-normal-submit}}“.\nMožete i da [[Special:EditWatchlist/raw|uredite sirov spisak]].",
- "watchlistedit-normal-submit": "Ukloni",
+ "watchlistedit-normal-submit": "Ukloni naslove",
"watchlistedit-normal-done": "{{PLURAL:$1|Jedna stranica je uklonjena|$1 stranice su uklonjene|$1 stranica je uklonjeno}} s vašeg spiska nadgledanja:",
"watchlistedit-raw-title": "Izmeni sirov spisak nadgledanja",
"watchlistedit-raw-legend": "Izmeni sirov spisak nadgledanja",
"compare-revision-not-exists": "Navedena izmena ne postoji.",
"dberr-problems": "Došlo je do tehničkih problema.",
"dberr-again": "Sačekajte nekoliko minuta i ponovo učitajte stranicu.",
- "dberr-info": "(ne mogu da se povežem sa serverom baze: $1)",
+ "dberr-info": "(ne mogu da se povežem sa serverom baze podataka: $1)",
+ "dberr-info-hidden": "(ne mogu da se povežem sa serverom baze podataka)",
"dberr-usegoogle": "U međuvremenu, pokušajte da pretražite pomoću Gugla.",
"dberr-outofdate": "Imajte na umu da njihovi primerci našeg sadržaja mogu biti zastareli.",
"dberr-cachederror": "Ovo je privremeno memorisan primerak strane koji možda nije ažuran.",
+++ /dev/null
-{
- "@metadata": {
- "authors": [
- "Milicevic01",
- "Misos",
- "Terik",
- "Жељко Тодоровић",
- "Михајло Анђелковић"
- ]
- },
- "vector-view-viewsource": "#REDIRECT[[MediaWiki:Vector-view-viewsource/sr-ec]]",
- "postedit-confirmation": "",
- "newuserlogpage": "историја креирања корисника",
- "newuserlogpagetext": "Ово је историја скорашњих креирања корисника.",
- "linksearch": "#REDIRECT[[MediaWiki:Linksearch/sr-ec]]",
- "linksearch-text": "#REDIRECT[[MediaWiki:Linksearch-text/sr-ec]]",
- "linksearch-line": "$1 повезана са $2",
- "linksearch-error": "Џокери могу да се појављују само на почетку домена.",
- "uctop": ""
-}
"Where next Columbus?",
"WikiPhoenix",
"לערי ריינהארט",
- "아라"
+ "아라",
+ "Abbedabb"
]
},
"tog-underline": "Stryk under länkar:",
"qbmyoptions": "Mina sidor",
"faq": "FAQ",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Nytt ämne",
- "vector-action-delete": "Radera",
- "vector-action-move": "Flytta",
- "vector-action-protect": "Skrivskydda",
- "vector-action-undelete": "Återställ",
- "vector-action-unprotect": "Ändra skydd",
- "vector-view-create": "Skapa",
- "vector-view-edit": "Redigera",
- "vector-view-history": "Visa historik",
- "vector-view-view": "Visa",
- "vector-view-viewsource": "Visa källa",
"actions": "Åtgärder",
- "vector-more-actions": "Mer",
"namespaces": "Namnrymder",
"variants": "Varianter",
"navigation-heading": "Navigeringsmeny",
"toc": "Innehåll",
"showtoc": "visa",
"hidetoc": "göm",
- "collapsible-collapse": "Kollapsa",
- "collapsible-expand": "Expandera",
+ "collapsible-collapse": "Dölj",
+ "collapsible-expand": "Visa",
"thisisdeleted": "Visa eller återställ $1?",
"viewdeleted": "Visa $1?",
"restorelink": "{{PLURAL:$1|en raderad version|$1 raderade versioner}}",
"mergehistory-empty": "Inga versioner av sidorna kan sammanfogas.",
"mergehistory-success": "$3 {{PLURAL:$3|version|versioner}} av [[:$1]] har infogats i [[:$2]].",
"mergehistory-fail": "Historikerna kunde inte sammanfogas, kontrollera de sidor och den sidversion som du valt.",
+ "mergehistory-fail-toobig": "Kunde inte utföra historiksammanslagningen då fler än maxgränsen på $1 {{PLURAL:$1|version|versioner}} skulle ha flyttats.",
"mergehistory-no-source": "Källsidan $1 finns inte.",
"mergehistory-no-destination": "Målsidan $1 finns inte.",
"mergehistory-invalid-source": "Källsidan måste vara en giltig sidtitel.",
"difference-missing-revision": "{{PLURAL:$2|En version|$2 versioner}} av denna skillnad ($1) kunde inte hittas.\n\nDetta orsakas vanligtvis av att följa en utgången difflänk till en sida som har raderats.\nDetaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].",
"searchresults": "Sökresultat",
"searchresults-title": "Sökresultat för \"$1\"",
- "toomanymatches": "Sökningen gav för många resultat, försök med en annan fråga",
"titlematches": "Träffar i sidtitlar",
"textmatches": "Artikeltexter som matchar sökningen",
"notextmatches": "Inga artikeltexter matchar sökningen",
"largefileserver": "Denna fil är större än vad servern ställts in att tillåta.",
"emptyfile": "Filen du laddade upp verkar vara tom; felet kan bero på ett stavfel i filnamnet. Kontrollera om du verkligen vill ladda upp denna fil.",
"windows-nonascii-filename": "Denna wiki stödjer inte filnamn med specialtecken.",
- "fileexists": "Det finns redan en fil med detta namn.\nTitta på <strong>[[:$1]]</strong>, såvida du inte är säker på att du vill ändra den.\n[[$1|thumb]]",
+ "fileexists": "Det finns redan en fil med detta namn. Titta på <strong>[[:$1]]</strong>, om {{GENDER:|du}} inte är säker på att {{GENDER:|du}} vill ändra den.\n[[$1|thumb]]",
"filepageexists": "Beskrivningssidan för denna fil har redan skapats på <strong>[[:$1]]</strong>, men just nu finns ingen fil med detta namn.\nDen sammanfattning du skriver här kommer inte visas på beskrivningssidan.\nFör att din sammanfattning ska visas där, så måste du redigera beskrivningssidan manuellt.\n[[$1|thumb]]",
- "fileexists-extension": "En fil med ett liknande namn finns redan: [[$2|thumb]]\n* Namn på den fil du försöker ladda upp: <strong>[[:$1]]</strong>\n* Namn på filen som redan finns: <strong>[[:$2]]</strong>\nVar vänlig välj ett annat namn.",
+ "fileexists-extension": "En fil med ett liknande namn finns redan: [[$2|thumb]]\n* Namn på den fil du försöker ladda upp: <strong>[[:$1]]</strong>\n* Namn på filen som redan finns: <strong>[[:$2]]</strong>\nVill du möjligen välja ett mer distinkt namn?",
"fileexists-thumbnail-yes": "Filen verkar vara en bild med förminskad storlek ''(miniatyrbild)''. [[$1|thumb]]\nVar vänlig kontrollera filen <strong>[[:$1]]</strong>.\nOm det är samma fil i originalstorlek så är det inte nödvändigt att ladda upp en extra miniatyrbild.",
"file-thumbnail-no": "Filnamnet börjar med <strong>$1</strong>.\nDet verkar vara en bild med förminskad storlek ''(miniatyrbild)''.\nOm du har denna bild i full storlek, ladda då hellre upp den, annars var vänlig och ändra filens namn.",
"fileexists-forbidden": "En fil med detta namn existerar redan, och kan inte överskrivas.\nOm du fortfarande vill ladda upp din fil, var god gå tillbaka och välj ett nytt namn. [[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "Radering och återställning av filer har tillfälligt avaktiverats under underhåll.",
"filedelete-maintenance-title": "Kan inte radera filen",
"mimesearch": "MIME-sökning",
- "mimesearch-summary": "På den här sidan kan du söka efter filer via dess MIME-typ. Input: contenttype/subtype, t.ex. <code>image/jpeg</code>.",
+ "mimesearch-summary": "Denna sidan gör det möjligt att filtrera filer via dess MIME-typ.\nIndata: contenttype/subtype, t.ex. <code>image/jpeg</code>.",
"mimetype": "MIME-typ:",
"download": "ladda ner",
"unwatchedpages": "Obevakade sidor",
"tooltip-summary": "Skriv en kort sammanfattning",
"interlanguage-link-title": "$1 - $2",
"common.css": "/* CSS som skrivs här påverkar alla skal */",
- "monobook.css": "/* CSS som skrivs här kommer att påverka alla användare av skalet Monobook */",
- "vector.css": "/* CSS som skrivs här kommer att påverka alla användare av skalet Vector */",
"print.css": "/* CSS som skrivs här kommer att påverka utskriftsversionen */",
"noscript.css": "/* CSS som placeras här kommer att påverka användare med JavaScript inaktiverat */",
"group-autoconfirmed.css": "/* CSS som placeras här kommer bara att påverka bekräftade användare */",
"group-sysop.css": "/* CSS som placeras här kommer bara att påverka administratörer */",
"group-bureaucrat.css": "/* CSS som placeras här kommer bara att påverka byråkrater */",
"common.js": "/* JavaScript som skrivs här körs varje gång en användare laddar en sida. */",
- "monobook.js": "/* JavaScript här kommer att laddas för dem som använder skalet Monobook */",
- "vector.js": "/* JavaScript här kommer att laddas för dem som använder skalet Vector */",
"group-autoconfirmed.js": "/* JavaScript här kommer att laddas för bekräftade användare */",
"group-user.js": "/* JavaScript här kommer att laddas för registrerade användare */",
"group-bot.js": "/* JavaScript här kommer att laddas för robotar */",
"pageinfo-category-pages": "Antal sidor",
"pageinfo-category-subcats": "Antal underkategorier",
"pageinfo-category-files": "Antal filer",
- "skinname-monobook": "Monobook",
- "skinname-vector": "Vector",
"markaspatrolleddiff": "Märk som patrullerad",
"markaspatrolledtext": "Märk den här sidan som patrullerad",
"markedaspatrolled": "Markerad som patrullerad",
"version-hook-name": "Namn på hook",
"version-hook-subscribedby": "Används av",
"version-version": "(Version $1)",
+ "version-no-ext-name": "[inget namn]",
"version-license": "MediaWiki-licens",
"version-ext-license": "Licens",
"version-ext-colheader-name": "Tillägg",
"qbmyoptions": "నా పేజీలు",
"faq": "తరచూ అడిగే ప్రశ్నలు",
"faqpage": "Project:తరచూ అడిగే ప్రశ్నలు",
- "vector-action-addsection": "విషయాన్ని చేర్చు",
- "vector-action-delete": "తొలగించు",
- "vector-action-move": "తరలించు",
- "vector-action-protect": "సంరక్షించు",
- "vector-action-undelete": "తొలగింపును రద్దుచెయ్యి",
- "vector-action-unprotect": "సంరక్షణను మార్చు",
- "vector-view-create": "సృష్టించు",
- "vector-view-edit": "సవరించు",
- "vector-view-history": "చరిత్రను చూడండి",
- "vector-view-view": "చదువు",
- "vector-view-viewsource": "మూలాన్ని చూపించు",
"actions": "పనులు",
- "vector-more-actions": "మరిన్ని",
"namespaces": "పేరుబరులు",
"variants": "వివిధ రూపాలు",
"navigation-heading": "మార్గదర్శకపు మెనూ",
"difference-missing-revision": "ఈ తేడా ($1) యొక్క {{PLURAL:$2|ఒక కూర్పు|$2 కూర్పులు}} {{PLURAL:$2|కనబడలేదు}}.\n\nసాధారణంగా, తొలగించబడిన పేజీ యొక్క కాలం చెల్లిన ’తేడా’ లింకును నొక్కినపుడు ఇది జరుగుతుంది. \n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} తొలగింపు లాగ్] లో వివరాలు ఉంటాయి.",
"searchresults": "వెతుకులాట ఫలితాలు",
"searchresults-title": "\"$1\" కి వెతుకులాట ఫలితాలు",
- "toomanymatches": "మరీ ఎక్కువ పోలికలు వచ్చాయి, దయచేసి మరో ప్రశ్నని ప్రయత్నించండి",
"titlematches": "వ్యాస శీర్షిక సరిపోయింది",
"textmatches": "పేజిలోని పాఠం సరిపోలింది",
"notextmatches": "పేజీ పాఠ్యమేదీ సరిపోలడం లేదు",
"pageinfo-category-pages": "పేజీల సంఖ్య",
"pageinfo-category-subcats": "ఉపవర్గాల సంఖ్య",
"pageinfo-category-files": "దస్త్రాల సంఖ్య",
- "skinname-monobook": "మోనోబుక్",
- "skinname-vector": "వెక్టర్",
"markaspatrolleddiff": "పరీక్షించినట్లుగా గుర్తు పెట్టు",
"markaspatrolledtext": "ఈ వ్యాసాన్ని పరీక్షించినట్లుగా గుర్తు పెట్టు",
"markedaspatrolled": "పరీక్షింపబడినట్లు గుర్తింపబడింది",
"qbmyoptions": "หน้าของฉัน",
"faq": "คำถามพบบ่อย",
"faqpage": "Project:คำถามพบบ่อย",
- "vector-action-addsection": "เพิ่มหัวข้อใหม่",
- "vector-action-delete": "ลบ",
- "vector-action-move": "เปลี่ยนชื่อ",
- "vector-action-protect": "ล็อก",
- "vector-action-undelete": "กู้คืน",
- "vector-action-unprotect": "เปลี่ยนการล็อก",
- "vector-view-create": "สร้าง",
- "vector-view-edit": "แก้ไข",
- "vector-view-history": "ดูประวัติ",
- "vector-view-view": "อ่าน",
- "vector-view-viewsource": "ดูโค้ด",
"actions": "ปฏิบัติการ",
- "vector-more-actions": "เพิ่มเติม",
"namespaces": "เนมสเปซ",
"variants": "สิ่งที่แตกต่าง",
"navigation-heading": "รายการเลือกป้ายบอกทาง",
"nstab-image": "ไฟล์",
"nstab-mediawiki": "ข้อความ",
"nstab-template": "แม่แบบ",
- "nstab-help": "หà¸\99à¹\89าà¸\84ำà¸à¸\98ิà¸\9aาย",
+ "nstab-help": "หà¸\99à¹\89าวิà¸\98ีà¹\83à¸\8aà¹\89",
"nstab-category": "หมวดหมู่",
"nosuchaction": "ไม่มีการกระทำดังกล่าว",
"nosuchactiontext": "การกระทำที่กำหนดผ่านยูอาร์แอลดังกล่าวไม่สามารถใช้ได้\nคุณอาจกรอกยูอาร์แอลผิด หรือมาตามลิงก์ที่ไม่ถูกต้อง\nหรืออาจเกิดจากข้อผิดพลาดในซอฟต์แวร์ซึ่ง {{SITENAME}} ใช้อยู่",
"difference-missing-revision": "ไม่พบรุ่น{{PLURAL:$2|รุ่น| $2 รุ่น}}ของผลต่างนี้ ($1)\n\nโดยปกติเกิดจากการเข้าลิงก์ผลต่างของหน้าที่ถูกลบไปแล้ว \nดูรายละเอียดได้ที่[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
"searchresults": "ผลการค้นหา",
"searchresults-title": "ผลการค้นหาสำหรับ \"$1\"",
- "toomanymatches": "พบตรงกันมากเกินไป กรุณาลองใช้คำค้นหาอื่น",
"titlematches": "พบชื่อเรื่องหน้าตรงกัน",
"textmatches": "พบข้อความตรงในหน้า",
"notextmatches": "ไม่พบข้อความตรงในหน้า",
"importunknownsource": "ไม่ทราบชนิดของไฟล์นำเข้า",
"importcantopen": "ไม่สามารถเปิดไฟล์นำเข้าได้",
"importbadinterwiki": "ลิงก์ข้ามภาษาเสีย",
- "importsuccess": "à¸\99ำà¹\80à¸\82à¹\89าà¹\84à¸\9fลà¹\8cสำà¹\80รà¹\87à¸\88!",
+ "importsuccess": "นำเข้าสำเร็จ!",
"importnosources": "ไม่มีการกำหนดแหล่งนำเข้าข้ามวิกิ และการอัปโหลดประวัติหน้าโดยตรงถูกปิดการใช้งาน",
"importnofile": "ไฟล์นำเข้าไม่ได้ถูกอัปโหลด",
"importuploaderrorsize": "อัปโหลดไฟล์ข้อมูลนำเข้าไม่สำเร็จ\nขนาดไฟล์ใหญ่เกินกว่าที่อนุญาตไว้",
"tooltip-preferences-save": "บันทึกการตั้งค่า",
"tooltip-summary": "ใส่คำอธิบายอย่างย่อสั้น ๆ",
"common.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ทุกสกิน */",
- "monobook.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินโมโนบุ๊ก */",
- "vector.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินเวกเตอร์ */",
"print.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ข้อมูลส่งออกเป็นสิ่งพิมพ์ */",
"noscript.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ปิดการใช้งานจาวาสคริปต์ */",
"group-autoconfirmed.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ทั่วไปเท่านั้น */",
"group-sysop.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ดูแลเท่านั้น */",
"group-bureaucrat.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ดูแลสิทธิแต่งตั้งเท่านั้น */",
"common.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ทุกคนในทุกหน้า */",
- "monobook.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินโมโนบุ๊ก */",
- "vector.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินเวกเตอร์ */",
"group-autoconfirmed.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ทั่วไปเท่านั้น */",
"group-bot.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่บอตเท่านั้น */",
"group-sysop.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ดูแลเท่านั้น */",
"pageinfo-category-pages": "จำนวนหน้า",
"pageinfo-category-subcats": "จำนวนหมวดหมู่ย่อย",
"pageinfo-category-files": "จำนวนไฟล์",
- "skinname-monobook": "โมโนบุ๊ก",
- "skinname-vector": "เวกเตอร์",
"markaspatrolleddiff": "ทำเครื่องหมายว่าตรวจสอบแล้ว",
"markaspatrolledtext": "ทำเครื่องหมายว่าหน้านี้ถูกตรวจสอบแล้ว",
"markedaspatrolled": "ตรวจสอบแล้ว",
"watchlistedit-raw-done": "รายการเฝ้าดูของคุณได้ปรับแล้ว",
"watchlistedit-raw-added": "$1 ชื่อเรื่องได้ถูกเพิ่มเข้าไป:",
"watchlistedit-raw-removed": "$1 ชื่อเรื่องได้ถูกนำออกไป:",
+ "watchlistedit-clear-legend": "ล้างรายการเฝ้าดู",
+ "watchlisttools-clear": "ล้างรายการเฝ้าดู",
"watchlisttools-view": "ดูการเปลี่ยนแปลงที่เกี่ยวข้อง",
"watchlisttools-edit": "ดูและแก้ไขรายการเฝ้าดู",
"watchlisttools-raw": "แก้ไขรายการเฝ้าดูทั้งหมด",
"qbmyoptions": "Mga pahina ko",
"faq": "Mga karaniwang itinatanong (''FAQ'')",
"faqpage": "Project:Mga karaniwang itinatanong (''FAQ'')",
- "vector-action-addsection": "Magdagdag ng paksa",
- "vector-action-delete": "Burahin",
- "vector-action-move": "Ilipat",
- "vector-action-protect": "Ipagsanggalang",
- "vector-action-undelete": "Alisin ang pagbubura",
- "vector-action-unprotect": "Baguhin ang pagsasanggalang",
- "vector-view-create": "Likhain",
- "vector-view-edit": "Baguhin",
- "vector-view-history": "Tingnan ang kasaysayan",
- "vector-view-view": "Basahin",
- "vector-view-viewsource": "Tingnan ang pinagmulan",
"actions": "Mga kilos",
"namespaces": "Mga ngalan-espasyo",
"variants": "Naiiba pa",
"yourpassword": "Password:",
"userlogin-yourpassword": "Password",
"userlogin-yourpassword-ph": "Ipasok ang iyong password",
- "createacct-yourpassword-ph": "Ilagay ang hudyat (password)",
+ "createacct-yourpassword-ph": "Ilagay ang password",
"yourpasswordagain": "Password mo uli:",
- "createacct-yourpasswordagain": "Tiyakin ang hudyat",
- "createacct-yourpasswordagain-ph": "Muling ilagay ang hudyat (password)",
+ "createacct-yourpasswordagain": "Tiyakin ang password",
+ "createacct-yourpasswordagain-ph": "Muling ilagay ang password",
"remembermypassword": "Tandaan ang paglagda ko sa kompyuter na ito (pinakamarami na ang $1 {{PLURAL:$1|araw|mga araw}})",
"userlogin-remembermypassword": "Panatilihin akong naka-login",
"userlogin-signwithsecure": "Gumamit ng ligtas na koneksyon",
"noemail": "Walang nakatalang adres ng e-liham para sa tagagamit na \"$1\".",
"noemailcreate": "Kailangan mong magbigay ng may-bisang direksiyong e-liham",
"passwordsent": "Isang bagong password ang ipinadala sa email address na nakatala para kay \"$1\".\nPaki login muli pagkaraan mong matanggap ito.",
- "blocked-mailpassword": "Hinarangan sa paggawa ng mga pagbabago ang iyong adres ng IP, at kaya hindi rin pinapahintulutang gumamit ng tungkuling makabawi ng hudyat para maiwasan ang pangaabuso.",
+ "blocked-mailpassword": "Hinarangan sa paggawa ng mga pagbabago ang iyong IP address, at kaya hindi rin pinapahintulutang gumamit ng tungkuling makabawi ng password para maiwasan ang pang-aabuso.",
"eauthentsent": "Nagpadala ng isang email na pangkompirmasyon doon sa tinukoy na email address.\nBago magpadala ng iba email sa account, kailangan mong sundin ang mga tagubiling nasa loob ng email, para mapatunayang iyo talaga ang account.",
"throttled-mailpassword": "Nagpadala na ng isang paalalang pang-password, nitong huling {{PLURAL:$1|oras|$1 oras}}.\nPara maiwasin ang pangaabuso, isang paalalang pang-password lamang ang ipapadala bawat {{PLURAL:$1|oras|$1 oras}}.",
"mailerror": "Kamalian sa pagpapadala ng liham: $1",
"passwordreset-username": "Pangalan ng tagagamit:",
"passwordreset-domain": "Nasasakupan:",
"passwordreset-capture": "Tingnan ang lumabas na e-liham?",
- "passwordreset-capture-help": "Kapag tsetsekan mo ang kahong ito, ang e-liham (may pansamantalang hudyat) ay ipapakita sa iyo at ipapadala rin sa tagagamit.",
+ "passwordreset-capture-help": "Kapag tsetsekan mo ang kahong ito, ang email (may pansamantalang password) ay ipapakita sa iyo at ipapadala rin sa tagagamit.",
"passwordreset-email": "Direksiyong e-liham:",
"passwordreset-emailtitle": "Mga detalye ng account sa {{SITENAME}}",
"passwordreset-emailtext-ip": "Isang tao (marahil ay ikaw, mula sa IP address na $1) ang humiling ng isang paalala sa iyong mga detalye ng account para sa {{SITENAME}} ($4). Ang sumusunod na {{PLURAL:$3|account ng tagagamit ay|mga account ng tagagamit ay}} may kaugnayan sa email address na ito:\n\n$2\n\n{{PLURAL:$3|Ang pansamantalang password na ito|Ang mga pansamantalang password na ito}} ay mawawalan ng bisa sa loob ng {{PLURAL:$5|isang araw|$5 araw}}.\nDapat kang mag-login at pumili ng isang bagong password ngayon. Kung ibang tao ang gumawa ng kahilingang ito, o kung naalala mo na ang orihinal mong password, at hindi mo na nais palitan ito, maaari mong huwag nang pansinin ang mensaheng ito at magpatuloy sa paggamit ng luma mong password.",
"passwordreset-emailerror-capture": "Nalikha na ang isang e-liham na paalala, na ipinapakita sa ibaba, subalit nabigo ang pagpapadala sa tagagamit: $1",
"changeemail": "Baguhin ang direksiyong e-liham",
"changeemail-header": "Baguhin ang email address ng account",
- "changeemail-text": "Kumpletuhin ang pormularyong ito upang mabago ang tirahan na para sa e-liham mo. Kakailanganin mong ipasok ang iyong hudyat upang tiyakin ang pagbabagong ito.",
+ "changeemail-text": "Kumpletuhin ang form na ito upang mabago ang email address. Kakailanganin mong ipasok ang iyong password upang tiyakin ang pagbabagong ito.",
"changeemail-no-info": "Kailangan mong lumagda upang tuwirang mapuntahan ang pahinang ito.",
"changeemail-oldemail": "Kasalukuyang direksiyong e-liham:",
"changeemail-newemail": "Bagong direksiyong e-liham:",
"loginreqlink": "lumagda/tumala",
"loginreqpagetext": "Kailangan mong $1 para matanaw ang ibang mga pahina.",
"accmailtitle": "Ipinadala na ang password.",
- "accmailtext": "Ipinadala na sa $2 ang isang hudyat na nilikha ng pagkakataon para kay [[User talk:$1|$1]]. Maaari itong baguhin sa pahinang ''[[Special:ChangePassword|palitan ng hudyat]]'' kapag lumagdang papasok.",
+ "accmailtext": "Ipinadala na sa $2 ang isang password na nilikha ng pagkakataon para kay [[User talk:$1|$1]]. Maaari itong baguhin sa pahinang ''[[Special:ChangePassword|palitan ang password]]'' kapag nag-login.",
"newarticle": "(Bago)",
"newarticletext": "Sinundan mo ang isang kawing para sa isang pahinang hindi pa umiiral.\nPara likhain ang pahina, magsimulang magmakinilya sa loob ng kahong nasa ibaba (tingnan ang [$1 pahina ng tulong] para sa mas maraming kabatiran).\nKung napunta ka rito dahil sa pagkakamali, pakipindot ang pinduntang '''balik''' ('''''back''''') ng iyong pantingin-tingin (''browser'').",
"anontalkpagetext": "Ito ang pahinang usapan para sa isang hindi nakikilalang tagagamit na hindi pa lumilikha ng account, o kaya hindi ito ginagamit.\nKaya't kinailangan naming gamitin ang may bilang na IP address para makilala siya.\nMaaaring pagsaluhan ng ilang mga tagagamit ang ganiyang IP address.\nKung isa kang hindi nagpapakilalang tagagamit at nakadaramang may mga walang saysay na komentong patungkol sa iyo, [[Special:UserLogin/signup|pakilikha ng isang account]] o [[Special:UserLogin|lumagda]] para maiwasan ang kalituhan o mapagkamalan ka bilang ibang hindi nakikilalang mga tagagamit sa hinaharap.",
"difference-missing-revision": "Hindi natagpuan ang {{PLURAL:$2|isang rebisyon|$2 mga rebisyon}} ng kaibahang ($1) ito.\n\nKaraniwang itong isinanhi ng pagsunod sa isang wala na sa panahong kawing sa pagkakaiba na papunta sa isang pahinang nabura na.\nMatatagpuan ang mga detalye sa loob ng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan ng pagbura].",
"searchresults": "Kinalabasan/Resulta ng paghahanap",
"searchresults-title": "Resulta ng paghahanap para sa \"$1\"",
- "toomanymatches": "Napakaraming mga tumutugmang ibinalik, pakisubok ang isang ibang tanong",
"titlematches": "Tumutugma ang pamagat ng pahina",
"textmatches": "Tumutugma ang teksto ng pahina",
"notextmatches": "Walang katugmang pahina ng teksto",
"tooltip-preferences-save": "Sagipin ang mga nais",
"tooltip-summary": "Magbigay ng maikling buod",
"common.css": "/* Ang inilagay na CSS dito ay gagamitin para sa lahat ng mga pabalat */",
- "monobook.css": "/* Ang CSS na inilagay dito ay makakaapekto sa mga tagagamit ng pabalat na Monobook */",
- "vector.css": "/* Ang inilagay na CSS dito ay makakaapekto sa mga tagagamit ng pabalat na Vector */",
"print.css": "/* Ang CSS na inilagay dito ay makakaapekto sa kalalabasan o resulta ng paglilimbag */",
"noscript.css": "/* Ang inilagay na Cascading Style Sheets dito ay makakaapekto sa mga tagagamit na hindi nagpapagana ng JavaScript */",
"group-autoconfirmed.css": "/* Ang inilagay na Mga Pilas ng Estilong Lumalagaslas (Cascading Style Sheets o CSS) dito ay makakaapekto lamang sa mga tagagamit na kusang natiyak */",
"group-sysop.css": "/* Ang inilagay na Mga Pilas ng Estilong Lumalagaslas (Cascading Style Sheets) dito ay makakaapekto lamang sa mga tagapagpaandar ng sistema */",
"group-bureaucrat.css": "/* Ang inilagay na Mga Pilas ng Estilong Lumalagaslas (Cascading Style Sheets o CSS) dito ay makakaapekto lamang sa mga burokrata */",
"common.js": "/* Ang anumang JavaScript dito ay ikakarga para sa lahat ng mga tagagamit ng bawat pahinang ikinarga. */",
- "monobook.js": "/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng pabalat na MonoBook */",
- "vector.js": "/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng pabalat na Vector */",
"group-autoconfirmed.js": "/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na kusang natiyak lamang */",
"group-bot.js": "/* Ang anumang JavaScript dito ay ikakarga para sa mga bot lamang */",
"group-sysop.js": "/* Ang anumang JavaScript dito ay ikakarga para sa mga tagapagpaandar ng sistema lamang */",
"pageinfo-magic-words": "{{PLURAL:$1|Salita|Mga salita}}ng mahiwaga ($1)",
"pageinfo-hidden-categories": "Nakatagong {{PLURAL:$1|kategorya|mga kategorya}} ($1)",
"pageinfo-templates": "{{PLURAL:$1|Suleras|Mga suleras}} ($1) na nasa transklusyon (kasama sa maraming mga lugar)",
- "skinname-monobook": "MonoBook",
- "skinname-vector": "Vector",
"markaspatrolleddiff": "Tatakan bilang napatrolya na",
"markaspatrolledtext": "Tatakan ang pahinang ito bilang napatrolya na",
"markedaspatrolled": "Tatakan bilang napatrolya na",
"Vugar 1981",
"לערי ריינהארט",
"아라",
- "Arystanbek"
+ "Arystanbek",
+ "Sayginer"
]
},
"tog-underline": "Bağlantıların altını çiz:",
"qbmyoptions": "Sayfalarım",
"faq": "SSS",
"faqpage": "Project:SSS",
- "vector-action-addsection": "Konu ekle",
- "vector-action-delete": "Sil",
- "vector-action-move": "Taşı",
- "vector-action-protect": "Koru",
- "vector-action-undelete": "Silinmeyi geri al",
- "vector-action-unprotect": "Korumayı değiştir",
- "vector-view-create": "Oluştur",
- "vector-view-edit": "Düzenle",
- "vector-view-history": "Geçmişi gör",
- "vector-view-view": "Oku",
- "vector-view-viewsource": "Kaynağı gör",
"actions": "Eylemler",
- "vector-more-actions": "Diğer",
"namespaces": "Ad alanları",
"variants": "Türevler",
"navigation-heading": "Gezinti menüsü",
"jumptonavigation": "kullan",
"jumptosearch": "ara",
"view-pool-error": "Üzgünüz, sunucular şu anda aşırı yüklendi.\nBirçok kullanıcı bu sayfayı görüntülemeye çalışıyor.\nLütfen bu sayfaya tekrar erişmeyi denemeden önce biraz bekleyin.\n\n$1",
+ "generic-pool-error": "Üzgünüz, sunucular şu anda aşırı yüklendi.\nBirçok kullanıcı bu sayfayı görüntülemeye çalışıyor.\nLütfen bu sayfaya tekrar erişmeyi denemeden önce biraz bekleyin.\n\n$1",
"pool-timeout": "Kilit için zaman bitimi bekleniyor",
"pool-queuefull": "Havuz sırası dolu",
"pool-errorunknown": "Bilinmeyen hata",
"difference-missing-revision": "Bu farkın {{PLURAL:$2|bir revizyonu|$2 revizyonu}} ($1) {{PLURAL:$2|bulunamadı|bulunamadı}}.\n\nBu genellikle, silinen bir sayfaya olan eski tarihli bir fark sayfasına bağlantılardan dolayı olur.\nAyrıntılar [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} silme günlüğünde] bulunabilir.",
"searchresults": "Arama sonuçları",
"searchresults-title": "\"$1\" için arama sonuçları",
- "toomanymatches": "Çok fazla eşleşme döndü, lütfen başka bir sorgu seçin",
"titlematches": "Madde adı eşleşiyor",
"textmatches": "Sayfa metni eşleşiyor",
"notextmatches": "Hiçbir sayfada bulunamadı",
"powersearch-togglelabel": "Seç:",
"powersearch-toggleall": "Hepsi",
"powersearch-togglenone": "Hiçbiri",
+ "powersearch-remember": "Gelecek aramalarda seçimi hatırla",
"search-external": "Dış arama",
"searchdisabled": "{{SITENAME}} sitesinde arama yapma geçici olarak durdurulmuştur. Bu arada Google kullanarak {{SITENAME}} içinde arama yapabilirsiniz. Arama sitelerinde dizinlerin biraz eski kalmış olabileceğini göz önünde bulundurunuz.",
"search-error": "Arama yapılırken bir hata oluştu: $1",
"right-move": "Sayfaları taşı",
"right-move-subpages": "Sayfaları altsayfalarıyla beraber taşı",
"right-move-rootuserpages": "Kök kullanıcı sayfalarını taşı",
+ "right-move-categorypages": "Kategori sayfaları taşı",
"right-movefile": "Dosyaları taşı",
"right-suppressredirect": "Bir sayfayı taşırken eski isimden yönlendirme oluşturma",
"right-upload": "Dosyaları yükle",
"action-createpage": "sayfa oluşturmaya",
"action-createtalk": "tartışma sayfası oluşturmaya",
"action-createaccount": "bu kullanıcı hesabını oluşturmaya",
+ "action-history": "sayfa geçmişini görüntüle",
"action-minoredit": "bu değişikliği küçük olarak işaretlemeye",
"action-move": "bu sayfayı taşımaya",
"action-move-subpages": "bu sayfayı ve altsayfalarını taşımaya",
"action-move-rootuserpages": "kök kullanıcı sayfalarını taşımaya",
+ "action-move-categorypages": "kategori sayfalarını taşı",
"action-movefile": "bu dosyayı taşımaya",
"action-upload": "bu dosyayı yüklemeye",
"action-reupload": "bu mevcut dosyanın üzerine yazmaya",
"recentchanges-label-plusminus": "Sayfa boyutundaki değişikliğin bayt bazında değeri",
"recentchanges-legend-heading": "'''Gösterge:'''",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ayrıca bakınız [[Special:NewPages|yeni sayfalar listesi]])",
- "rcnotefrom": "'''$2''' tarihinden itibaren yapılan değişiklikler aşağıdadır (en fazla <b>$1</b> tanesi gösterilmektedir).",
+ "rcnotefrom": "<strong>$2</strong> tarihinden itibaren yapılan değişiklikler aşağıdadır (en fazla <strong>$1</strong> tanesi gösterilmektedir).",
"rclistfrom": "$3 $2 tarihinden itibaren yeni değişiklikleri göster",
"rcshowhideminor": "Küçük değişiklikleri $1",
"rcshowhideminor-show": "Göster",
"largefileserver": "Bu dosyanın uzunluğu sunucuda izin verilenden daha büyüktür.",
"emptyfile": "Yüklediğiniz dosya boş görünüyor. Bunun sebebi dosya adındaki bir yazım hatası olabilir. Lütfen dosyayı gerçekten yüklemek isteyip istemediğinizden emin olun.",
"windows-nonascii-filename": "Bu viki dosya isimlerinde özel karakter kullanımını desteklemiyor",
- "fileexists": "Bu isimde bir dosya mevcut.\nEğer değiştirmekten emin değilseniz ilk önce <strong>[[:$1]]</strong> dosyasına bir gözatın.\n[[$1|thumb]]",
+ "fileexists": "Bu isimde bir dosya mevcut; eğer değiştirmekten emin değilseniz ilk önce <strong>[[:$1]]</strong> dosyasına bir göz atın.\n[[$1|thumb]]",
"filepageexists": "Bu dosya için açıklama sayfası <strong>[[:$1]]</strong> adresinde zaten oluşturulmuş, fakat bu isimde bir dosya şu anda mevcut değil.\nGireceğiniz özet açıklama sayfasında görünmeyecektir.\nÖzetinizin orada görünmesi için, bunu elle değiştirmelisiniz.\n[[$1|küçük resim]]",
"fileexists-extension": "Benzer isimle başka bir dosya mevcut: [[$2|thumb]]\n* Yüklenilen dosyanın adı: <strong>[[:$1]]</strong>\n* Varolan dosyanın adı: <strong>[[:$2]]</strong>\nLütfen başka bir isim seçin",
"fileexists-thumbnail-yes": "Bu dosya, bir resmi küçültülmüş sürümü gibi görünüyor ''(thumbnail)''. [[$1|thumb]]\nLütfen <strong>[[:$1]]</strong> dosyasını kontrol edin .\nEğer kontrol edilen dosya ile özgün boyutundaki aynı dosyaysa fazladan küçük resim yüklemeye gerek yoktur.",
"deadendpagestext": "Aşağıdaki sayfalar, {{SITENAME}} sitesinde diğer sayfalara bağlantı vermiyor.",
"protectedpages": "Koruma altındaki sayfalar",
"protectedpages-indef": "Sadece süresiz korumalar",
- "protectedpages-summary": "Bu sayfa şu anda koruma altında olan mevcut sayfaları listeler. Oluşturulması korunan başlıkların bir listesi için [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] sayfasına bakın.",
+ "protectedpages-summary": "Bu sayfa şu anda koruma altında olan mevcut sayfaları listeler. Oluşturulması korunan başlıkların listesi için [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] sayfasına bakın.",
"protectedpages-cascade": "Sadece ardışık korumalar",
"protectedpages-noredirect": "Yönlendirmeleri gizle",
"protectedpagesempty": "Şu anda, bu parametrelerle korunan hiç bir sayfa yok.",
"protectedpages-unknown-timestamp": "Bilinmiyor",
"protectedpages-unknown-performer": "Bilinmeyen kullanıcı",
"protectedtitles": "Korunan başlıklar",
- "protectedtitles-summary": "Bu sayfa şu anda oluşturulması korunan başlıkları listeler. Koruma altında olan mevcut sayfaların bir listesi için [[{{#special:ProtectedPages}}|{{int:protectedpages}}]] sayfasına bakın.",
+ "protectedtitles-summary": "Bu sayfa şu anda oluşturulması korunan başlıkları listeler. Koruma altında olan mevcut sayfaların listesi için [[{{#special:ProtectedPages}}|{{int:protectedpages}}]] sayfasına bakın.",
"protectedtitlesempty": "Şu anda, bu parametrelerle korunan hiç bir başlık yok.",
"listusers": "Kullanıcı listesi",
"listusers-editsonly": "Sadece değişiklik yapan kullanıcıları göster",
"listgrouprights-removegroup-self": "Kendi hesabından {{PLURAL:$2|grup|grupları}} çıkarabilir: $1",
"listgrouprights-addgroup-self-all": "Kendi hesabına tüm grupları ekleyebilir",
"listgrouprights-removegroup-self-all": "Kendi hesabından tüm grupları çıkarabilir",
+ "trackingcategories-nodesc": "Açıklama yok.",
"mailnologin": "Gönderi adresi yok.",
"mailnologintext": "Diğer kullanıcılara e-posta gönderebilmeniz için [[Special:UserLogin|oturum aç]]malısınız ve [[Special:Preferences|tercihler]] sayfasında geçerli bir e-posta adresiniz olmalı.",
"emailuser": "Bu kullanıcıya e-posta gönder",
"watchnologin": "Oturum açık değil.",
"addwatch": "İzleme listesine ekle",
"addedwatchtext": "\"[[:$1]]\" sayfası [[Special:Watchlist|izleme listenize]] eklenmiştir.\nBundan sonra, bu sayfaya ve ilgili tartışma sayfasına yapılacak değişiklikler burada listelenecek.",
+ "addedwatchtext-short": "\"$1\" sayfası izleme listenize eklendi.",
"removewatch": "İzleme listesinden kaldır",
"removedwatchtext": "\"[[:$1]]\" sayfası [[Special:Watchlist|izleme listenizden]] silinmiştir.",
+ "removedwatchtext-short": "\"$1\" sayfası izleme listenizden çıkarıldı.",
"watch": "izle",
"watchthispage": "Sayfayı izle",
"unwatch": "İzleme",
"delete-edit-reasonlist": "Silme nedenlerini değiştir",
"delete-toobig": "Bu sayfa, $1 {{PLURAL:$1|tane değişiklik|tane değişiklik}} ile çok uzun bir geçmişe sahiptir.\nBöyle sayfaların silinmesi, {{SITENAME}} sitesini bozmamak için sınırlanmaktadır.",
"delete-warning-toobig": "Bu sayfanın büyük bir değişiklik geçmişi var, $1 {{PLURAL:$1|revizyonun|revizyonun}} üzerinde.\nBunu silmek {{SITENAME}} işlemlerini aksatabilir;\ndikkatle devam edin.",
- "deleting-backlinks-warning": "'''Uyarı:''' Silmek üzere olduğunuz sayfaya başka sayfalardan bağlantıları var veya sayfanın bazı bölümleri başka sayfalar tarafından alıntı olarak kullanılıyor.",
+ "deleting-backlinks-warning": "'''Uyarı:''' Silmek üzere olduğunuz sayfaya [[Özel:SayfayaBağlantılar/{{FULLPAGENAME}}|başka sayfalardan]] bağlantılar var veya sayfanın bazı bölümleri başka sayfalar tarafından alıntı olarak kullanılıyor.",
"rollback": "değişiklikleri geri al",
"rollback_short": "geri al",
"rollbacklink": "geri döndür",
"contributions-title": "$1 için kullanıcı katkıları",
"mycontris": "Katkılar",
"contribsub2": "{{GENDER:$3|$1}} ($2) tarafından",
+ "contributions-userdoesnotexist": "\"$1\" kullanıcı hesabı kayıtlı değil.",
"nocontribs": "Bu kriterlere uyan değişiklik bulunamadı",
"uctop": "(son)",
"month": "Ay:",
"movenotallowedfile": "Sayfaları taşımaya izniniz yok.",
"cant-move-user-page": "Kullanıcı sayfalarını taşımaya izniniz yok (altsayfalardan başka).",
"cant-move-to-user-page": "Bir sayfayı, bir kullanıcı sayfasına taşımaya izniniz yok (bir kullanıcı altsayfası dışında).",
+ "cant-move-to-category-page": "Bir sayfayı, bir kategoriye taşımaya izniniz yok.",
"newtitle": "Yeni isim",
"move-watch": "Bu sayfayı izle",
"movepagebtn": "İsmi değiştir",
"tooltip-preferences-save": "Tercihleri kaydet",
"tooltip-summary": "Kısa bir özet girin",
"common.css": "/* Buraya konulacak CSS kodu tüm temalarda etkin olur */",
- "monobook.css": "/* Buraya konulacak CSS kodu tüm Monobook teması kullanan tüm kullanıcılarda etkin olur */",
"common.js": "/* Buraya konulacak JavaScript kodu sitedeki her kullanıcı için her sayfa yüklendiğinde çalışacaktır */",
"anonymous": "{{SITENAME}} sitesinin anonim {{PLURAL:$1|kullanıcısı|kullanıcıları}}",
"siteuser": "{{SITENAME}} kullanıcısı $1",
"newimages-summary": "Bu özel sayfa, en son yüklenen dosyaları göstermektedir.",
"newimages-legend": "Filtre",
"newimages-label": "Dosya adı (ya da bir parçası):",
+ "newimages-showbots": "Bot yüklemelerini göster",
"noimages": "Görecek bir şey yok.",
"ilsubmit": "Ara",
"bydate": "kronolojik sırayla",
"watchlistedit-raw-done": "İzleme listeniz güncellendi.",
"watchlistedit-raw-added": "{{PLURAL:$1|1 başlık|$1 başlık}} eklendi:",
"watchlistedit-raw-removed": "{{PLURAL:$1|1 başlık|$1 başlık}} silindi:",
+ "watchlistedit-clear-legend": "İzleme listesini temizle",
+ "watchlistedit-clear-explain": "İzleme listenizdeki tüm başlıklar silinecek",
+ "watchlistedit-clear-titles": "Başlıklar:",
+ "watchlistedit-clear-submit": "İzleme listesini temizle (Geri alınamaz!)",
+ "watchlistedit-clear-done": "İzleme listeniz temizlendi.",
+ "watchlistedit-clear-removed": "{{PLURAL:$1|1 başlık|$1 başlık}} silindi:",
+ "watchlisttools-clear": "İzleme listesini temizle",
"watchlisttools-view": "İlgili değişiklikleri göster",
"watchlisttools-edit": "İzleme listesini gör ve düzenle",
"watchlisttools-raw": "Ham izleme listesini düzenle",
"htmlform-no": "Hayır",
"htmlform-yes": "Evet",
"htmlform-chosen-placeholder": "Bir seçenek seçin",
+ "htmlform-cloner-delete": "Sil",
+ "htmlform-cloner-required": "En az bir değer gereklidir.",
"sqlite-has-fts": "$1 tam-metin arama desteği ile",
"sqlite-no-fts": "$1 tam-metin arama desteği olmaksızın",
"logentry-delete-delete": "$1 $3 sayfasını {{GENDER:$2|sildi}}",
"qbmyoptions": "Битләрем",
"faq": "ЕБС",
"faqpage": "Project:ЕБС",
- "vector-action-addsection": "Яңа тема өстәү",
- "vector-action-delete": "Бетерү",
- "vector-action-move": "Күчерү",
- "vector-action-protect": "Яклау",
- "vector-action-undelete": "Кайтару",
- "vector-action-unprotect": "Яклауны үзгәртү",
- "vector-view-create": "Төзү",
- "vector-view-edit": "Үзгәртү",
- "vector-view-history": "Тарихын карау",
- "vector-view-view": "Уку",
- "vector-view-viewsource": "Чыганагын карау",
"actions": "Хәрәкәт",
"namespaces": "Исемнәр мәйданы",
"variants": "Төрләр",
"creditspage": "Рәхмәтләр",
"spamprotectiontitle": "Спам фильтры",
"pageinfo-toolboxlink": "Бит турында мәгълүмат",
- "skinname-monobook": "Китап",
- "skinname-vector": "Сызымлы",
"markaspatrolledtext": "Бу мәкаләне тикшерелгән дип тамгалау",
"markedaspatrolled": "Тикшерелгән дип тамгаланды",
"markedaspatrolledtext": "Сайланган [[:$1]] мәкаләсенең әлеге юрамасы тикшерелгән дип тамгаланды.",
"qbmyoptions": "بەتلەرىم",
"faq": "كۆپ كۆرۈلىدىغان مەسىلىلەر",
"faqpage": "Project:كۆپ كۆرۈلىدىغان مەسىلىلەر",
- "vector-action-addsection": "يېڭى تېما قوش",
- "vector-action-delete": "ئۆچۈر",
- "vector-action-move": "يۆتكە",
- "vector-action-protect": "قوغدا",
- "vector-action-undelete": "ئەسلىگە قايتۇر",
- "vector-action-unprotect": "قوغداش ئۆزگەرت",
- "vector-view-create": "قۇر",
- "vector-view-edit": "تەھرىر",
- "vector-view-history": "تارىخ كۆرسەت",
- "vector-view-view": "ئوقۇ",
- "vector-view-viewsource": "مەنبەنى كۆرسەت",
"actions": "مەشغۇلات",
"namespaces": "ئات بوشلۇقى",
"variants": "ۋارىيانتلار",
"difference-missing-revision": "{{PLURAL:$2|نەشر|$2 نەشىر لەر}} نىڭ ($1) پەرق سېلىشتۇرما {{PLURAL:$2}} تېپىلمىدى.\n\nئادەتتە بۇ ئۆچۈرۈلگەن بەتنىڭ ئۇلانمىسىغا كىرگەنلىك سەۋەبىدىن بولىدۇ.\nتەپسىلىي ئۇچۇرنى [{{fullurl:{{#Special:log}}/delete|page={{FULLPAGENEMEE}}}}ئۆچۈرۈش خاتىرىسى] دىن تاپقىلى بولىدۇ.",
"searchresults": "ئىزدەش نەتىجىسى",
"searchresults-title": "\"$1\" نىڭ ئىزدەش نەتىجىسى",
- "toomanymatches": "ناھايىتى كۆپ ماسلىشىش ئىنكاس قايتۇردى، باشقا سۈرۈشتۈرۈشنى سىناڭ",
"titlematches": "بەت ماۋزۇسىغا ماس كەلدى",
"textmatches": "بەت مەزمۇنى ماس كەلدى",
"notextmatches": "ماس كېلىدىغان بەت مەزمۇنى يوق",
"tooltip-preferences-save": "مايىللىق ساقلا",
"tooltip-summary": "قىسقىچە ئۈزۈندە كىرگۈزۈڭ",
"common.css": "/* CSS placed here will be applied to all skins */",
- "monobook.css": "/* CSS placed here will affect users of the Monobook skin */",
- "vector.css": "/* CSS placed here will affect users of the Vector skin */",
"print.css": "/* CSS placed here will affect the print output */",
"noscript.css": "/* CSS placed here will affect users with JavaScript disabled */",
"group-autoconfirmed.css": "/* CSS placed here will affect autoconfirmed users only */",
"group-sysop.css": "/* CSS placed here will affect sysops only */",
"group-bureaucrat.css": "/* CSS placed here will affect bureaucrats only */",
"common.js": "/* Any JavaScript here will be loaded for all users on every page load. */",
- "monobook.js": "/* Any JavaScript here will be loaded for users using the MonoBook skin */",
- "vector.js": "/* Any JavaScript here will be loaded for users using the Vector skin */",
"group-autoconfirmed.js": "/* Any JavaScript here will be loaded for autoconfirmed users only */",
"group-bot.js": "/* Any JavaScript here will be loaded for bots only */",
"group-sysop.js": "/* Any JavaScript here will be loaded for sysops only */",
"pageinfo-category-pages": "بەت سانى",
"pageinfo-category-subcats": "تارماق تۈر سانى",
"pageinfo-category-files": "ھۆججەت سانى",
- "skinname-monobook": "MonoBook",
- "skinname-vector": "Vector",
"markaspatrolleddiff": "چارلاش بەلگىسى قوي",
"markaspatrolledtext": "بۇ بەتكە چارلاش بەلگىسى قوي",
"markedaspatrolled": "چارلاش بەلگىسى قويۇلغان",
"category-empty": "''Ця категорія зараз порожня.''",
"hidden-categories": "{{PLURAL:$1|1=Прихована категорія|Приховані категорії|Прихованих категорій}}",
"hidden-category-category": "Приховані категорії",
- "category-subcat-count": "{{PLURAL:$2|ЦÑ\8f каÑ\82егоÑ\80Ñ\96Ñ\8f маÑ\94 Ñ\82Ñ\96лÑ\8cки Ñ\82акÑ\83 пÑ\96дкаÑ\82егоÑ\80Ñ\96Ñ\8e.|ЦÑ\8f каÑ\82егоÑ\80Ñ\96Ñ\8f маÑ\94 $1 {{PLURAL:$1|Ñ\82акÑ\83 пÑ\96дкаÑ\82егоÑ\80Ñ\96Ñ\8e з|Ñ\82акÑ\96 пÑ\96дкаÑ\82егоÑ\80Ñ\96Ñ\97 з|Ñ\82акиÑ\85 підкатегорій із}} $2.}}",
+ "category-subcat-count": "{{PLURAL:$2|ЦÑ\8f каÑ\82егоÑ\80Ñ\96Ñ\8f маÑ\94 Ñ\82Ñ\96лÑ\8cки Ñ\82акÑ\83 пÑ\96дкаÑ\82егоÑ\80Ñ\96Ñ\8e.|Ð\9fоказано $1 {{PLURAL:$1|пÑ\96дкаÑ\82егоÑ\80Ñ\96Ñ\8e з|пÑ\96дкаÑ\82егоÑ\80Ñ\96Ñ\97 з|підкатегорій із}} $2.}}",
"category-subcat-count-limited": "У цій категорії {{PLURAL:$1|$1 підкатегорія|$1 підкатегорії|$1 підкатегорій}}.",
"category-article-count": "Показано $1 {{PLURAL:$1|сторінку|сторінки|сторінок}} цієї категорії (із $2).",
"category-article-count-limited": "У цій категорії {{PLURAL:$1|$1 сторінка|$1 сторінки|$1 сторінок}}.",
"qbmyoptions": "Мої налаштування",
"faq": "Часті питання",
"faqpage": "Project:Часті питання",
- "vector-action-addsection": "Додати тему",
- "vector-action-delete": "Вилучити",
- "vector-action-move": "Перейменувати",
- "vector-action-protect": "Захистити",
- "vector-action-undelete": "Відновити",
- "vector-action-unprotect": "Зміна захисту",
- "vector-view-create": "Створити",
- "vector-view-edit": "Редагувати",
- "vector-view-history": "Переглянути історію",
- "vector-view-view": "Читати",
- "vector-view-viewsource": "Переглянути код",
"actions": "Дії",
- "vector-more-actions": "Більше",
"namespaces": "Простори назв",
"variants": "Варіанти",
"navigation-heading": "Навігаційне меню",
"difference-missing-revision": "{{PLURAL:$2|$2 версія|$2 версії|$2 версій}} для цього порівняння ($1) не {{PLURAL:$2|1=знайдена|знайдені}}.\n\nІмовірно, ви перейшли за застарілим посиланням на порівняння версій вилученої сторінки.\nПодробиці можна дізнатися з [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журналу вилучень].",
"searchresults": "Результати пошуку",
"searchresults-title": "Результати пошуку для «$1»",
- "toomanymatches": "Знайдено дуже багато відповідностей, будь ласка, спробуйте інший запит",
"titlematches": "Збіги в назвах сторінок",
"textmatches": "Збіги в текстах сторінок",
"notextmatches": "Немає збігів у текстах сторінок",
"powersearch-togglelabel": "Позначити:",
"powersearch-toggleall": "Усі",
"powersearch-togglenone": "Жодний",
+ "powersearch-remember": "Запам'ятати вибір для майбутніх пошуків",
"search-external": "Зовнішній пошук",
"searchdisabled": "<p>Вибачте, повнотекстовий пошук тимчасово недоступний через перевантаження сервера; передбачається, що ця функція буде знову включена після установки нового обладнання. Поки що ми пропонуємо вам скористатися Google чи Yahoo!:</p>",
"search-error": "Сталася помилка під час пошуку:$1",
"tooltip-summary": "Введіть короткий опис",
"interlanguage-link-title": "$1 — $2",
"common.css": "/** Розміщений тут CSS буде застосовуватися до всіх тем оформлення */",
- "monobook.css": "/* Розміщений тут CSS буде застосовуватися до всіх тем оформлення Monobook */",
- "vector.css": "/* Розміщений тут CSS-код буде використаний в темі оформлення Векторне */",
"print.css": "/* Розміщений тут CSS-код буде використаний для друкованої версії */",
"noscript.css": "/* Розміщений тут CSS-код буде використаний для користувачів у яких вимкнено JavaScript */",
"group-autoconfirmed.css": "/* Розміщений тут CSS-код буде використаний для автопідтверджених користувачів */",
"group-sysop.css": "/* Розміщений тут CSS-код буде використаний тільки для адміністраторів */",
"group-bureaucrat.css": "/* Розміщений тут CSS-код буде використаний тільки для бюрократів */",
"common.js": "/* Розміщений тут код JavaScript буде завантажений всім користувачам при зверненні до будь-якої сторінки */",
- "monobook.js": "/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують тему оформлення Моно-книга */",
- "vector.js": "/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують векторну тему оформлення */",
"group-autoconfirmed.js": "/* Розміщений тут код JavaScript буде завантажений тільки для автопідтверджених користувачів */",
"group-bot.js": "/* Розміщений тут код JavaScript буде завантажений тільки для ботів */",
"group-sysop.js": "/* Розміщений тут код JavaScript буде завантажений тільки для адміністраторів */",
"pageinfo-category-pages": "Кількість сторінок",
"pageinfo-category-subcats": "Кількість підкатегорій",
"pageinfo-category-files": "Кількість файлів",
- "skinname-monobook": "Моно-книга",
- "skinname-vector": "Векторне",
"markaspatrolleddiff": "Позначити як перевірену",
"markaspatrolledtext": "Позначити цю сторінку як перевірену",
"markedaspatrolled": "Позначена як перевірена",
"qbmyoptions": "Moslamalarim",
"faq": "TSS",
"faqpage": "Project:TSS",
- "vector-action-addsection": "Mavzu qoʻshish",
- "vector-action-delete": "O‘chirish",
- "vector-action-move": "Ko‘chirish",
- "vector-action-protect": "Himoyalash",
- "vector-action-undelete": "Tiklash",
- "vector-action-unprotect": "Himoyalashni oʻzgartirish",
- "vector-view-create": "Yaratish",
- "vector-view-edit": "Tahrirlash",
- "vector-view-history": "Tarix",
- "vector-view-view": "Mutolaa",
- "vector-view-viewsource": "Manbasini koʻrish",
"actions": "Amallar",
- "vector-more-actions": "Yana",
"namespaces": "Nomfazolar",
"variants": "Variantlar",
"navigation-heading": "Navigatsiya",
"editundo": "qaytarish",
"searchresults": "Qidiruv natijalari",
"searchresults-title": "\"$1\" uchun qidiruv natijalari",
- "toomanymatches": "Juda ko'p o'xshashliklar topildi, iltimos, boshqa so'rov bilan urinib ko'ring",
"titlematches": "Sahifalar nomlaridagi mos kelishlar",
"textmatches": "Sahifalar matnlaridagi mos kelishlar",
"notextmatches": "Bunday matn topilmadi",
"pageinfo-edits": "Jami tahrirlar soni",
"pageinfo-toolboxlink": "Sahifa haqida maʼlumot",
"pageinfo-redirectsto": "Qayta yoʻnaltirish",
- "skinname-vector": "Vektor",
"patrol-log-page": "Patrullash qaydlari",
"previousdiff": "← Avvalgi tahrir",
"nextdiff": "Keyingi tahrir →",
"qbmyoptions": "Łe me pajine",
"faq": "Domande frequenti",
"faqpage": "Project:Domande frequenti",
- "vector-action-addsection": "Zonta discusion",
- "vector-action-delete": "Scanseła",
- "vector-action-move": "Sposta",
- "vector-action-protect": "Protezi",
- "vector-action-undelete": "Recupera",
- "vector-action-unprotect": "Canbia ła protesion",
- "vector-view-create": "Crea",
- "vector-view-edit": "Canbia",
- "vector-view-history": "Varda ła storia",
- "vector-view-view": "Lezi",
- "vector-view-viewsource": "Varda el testo",
"actions": "Asion",
"namespaces": "Namespace",
"variants": "Varianse",
"difference-missing-revision": "{{PLURAL:$2|Na version|$2 version}} de sta difarensa ($1) {{PLURAL:$2|nó ła xe sta trovà|nó łe xe stae trovae}}.\n\nCuesto se verifega de sołito seguendo un ligamente vecio de un dif a na pàjina scansełà.\nI detaji i pol esar catai inte'l [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de łe scansełasion].",
"searchresults": "Risultati de la riserca",
"searchresults-title": "Risultati de la riserca de \"$1\"",
- "toomanymatches": "Xe stà catà massa corispondense, par piaser próa a modificar la richiesta.",
"titlematches": "In tei titoli de le pagine",
"textmatches": "Corispondense nel testo de le pagine",
"notextmatches": "Nei testi de le pagine no gò catà gnente",
"qbmyoptions": "Trang cá nhân",
"faq": "Câu hỏi thường gặp",
"faqpage": "Project:Các câu hỏi thường gặp",
- "vector-action-addsection": "Thêm chủ đề",
- "vector-action-delete": "Xóa",
- "vector-action-move": "Di chuyển",
- "vector-action-protect": "Khóa",
- "vector-action-undelete": "Phục hồi",
- "vector-action-unprotect": "Đổi mức khóa",
- "vector-view-create": "Tạo",
- "vector-view-edit": "Sửa đổi",
- "vector-view-history": "Xem lịch sử",
- "vector-view-view": "Đọc",
- "vector-view-viewsource": "Xem mã nguồn",
"actions": "Tác vụ",
- "vector-more-actions": "Khác",
"namespaces": "Không gian tên",
"variants": "Biến thể",
"navigation-heading": "Trình đơn chuyển hướng",
"mergehistory-empty": "Không thể trộn được sửa đổi nào.",
"mergehistory-success": "$3 {{PLURAL:$3|sửa đổi|sửa đổi}} của [[:$1]] đã được trộn vào [[:$2]].",
"mergehistory-fail": "Không thể thực hiện được việc trộn lịch sử sửa đổi, vui lòng chọn lại trang cũng như thông số ngày giờ.",
+ "mergehistory-fail-toobig": "Không thể trộn lịch sử vì phải di chuyển $1 phiên bản và vượt quá giới hạn cho phép.",
"mergehistory-no-source": "Trang nguồn $1 không tồn tại.",
"mergehistory-no-destination": "Trang đích $1 không tồn tại.",
"mergehistory-invalid-source": "Trang nguồn phải có tiêu đề hợp lệ.",
"difference-missing-revision": "Không tìm thấy {{PLURAL:$2|một phiên bản|$2 phiên bản}} trong khác biệt này ($1).\n\nLỗi này thường xuất hiện đối khi theo dõi liên kết lỗi thời đến khác biệt giữa các bản của trang đã bị xóa.\nXem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} nhật trình xóa].",
"searchresults": "Kết quả tìm kiếm",
"searchresults-title": "Kết quả tìm kiếm “$1”",
- "toomanymatches": "Có quá nhiều kết quả được trả về, xin hãy thử câu tìm kiếm khác",
"titlematches": "Đề mục tương tự",
"textmatches": "Câu chữ tương tự",
"notextmatches": "Không tìm thấy nội dung trang",
"action-patrol": "đánh dấu đã tuần tra vào sửa đổi của người khác",
"action-autopatrol": "tự động đánh dấu đã tuần tra vào sửa đổi của bạn",
"action-unwatchedpages": "xem danh sách các trang chưa được theo dõi",
- "action-mergehistory": "hợp nhất lịch sử của trang này",
+ "action-mergehistory": "trộn lịch sử của trang này",
"action-userrights": "sửa đổi mọi quyền người dùng",
"action-userrights-interwiki": "sửa đổi quyền của người dùng tại wiki khác",
"action-siteadmin": "khóa hoặc mở khóa cơ sở dữ liệu",
"windows-nonascii-filename": "Wiki này không hỗ trợ ký tự đặc biệt trong tên tập tin.",
"fileexists": "Một tập tin với tên này đã tồn tại, xin hãy kiểm tra lại <strong>[[:$1]]</strong> nếu bạn không chắc bạn có muốn thay đổi nó hay không.\n[[$1|thumb]]",
"filepageexists": "Trang miêu tả của tập tin này đã được tạo tại <strong>[[:$1]]</strong>, nhưng hiện không có tập tin nào có tên như vậy.\nNhững gì bạn ghi trong ô \"Tóm tắt tập tin\" sẽ không hiện ra ở trang miêu tả.\nĐể khiến nó hiển thị, bạn cần phải sửa đổi trang đó bằng tay.\n[[$1|thumb]]",
- "fileexists-extension": "Hiện có một tập tin trùng tên: [[$2|thumb]]\n* Tên tập tin đang tải lên: <strong>[[:$1]]</strong>\n* Tên tập tin có từ trước: <strong>[[:$2]]</strong>\nXin hãy chọn một tên tập tin khác.",
+ "fileexists-extension": "Hiện có một tập tin trùng tên: [[$2|thumb]]\n* Tên tập tin đang tải lên: <strong>[[:$1]]</strong>\n* Tên tập tin có từ trước: <strong>[[:$2]]</strong>\nGợi ý bạn chọn một tên rõ hơn.",
"fileexists-thumbnail-yes": "Tập tin này có vẻ là hình có kích thước thu gọn ''(hình thu nhỏ)''. [[$1|thumb]]\nXin kiểm tra lại tập tin <strong>[[:$1]]</strong>.\nNếu tập tin được kiểm tra trùng với hình có kích cỡ gốc thì không cần thiết tải lên một hình thu nhỏ khác.",
"file-thumbnail-no": "Tên tập tin bắt đầu bằng <strong>$1</strong>.\nCó vẻ đây là bản thu nhỏ của hình gốc ''(thumbnail)''.\nNếu bạn có hình ở độ phân giải tối đa, xin hãy tải bản đó lên, nếu không xin hãy đổi lại tên tập tin.",
"fileexists-forbidden": "Đã có tập tin với tên gọi này, và nó không thể bị ghi đè.\nNếu bạn vẫn muốn tải tập tin của bạn lên, xin hãy quay lại và sử dụng một tên khác. [[File:$1|thumb|center|$1]]",
"filedelete-maintenance": "Tác vụ xóa và phục hồi tập tin đã bị tắt tạm thời trong khi bảo trì.",
"filedelete-maintenance-title": "Không thể xóa tập tin",
"mimesearch": "Tìm kiếm theo định dạng",
- "mimesearch-summary": "Trang này có khả năng lọc tập tin theo kiểu MIME. Đầu vào: kiểu-nội-dung/kiểu-phụ, v.d. <code>image/jpeg</code>.",
+ "mimesearch-summary": "Trang này có khả năng lọc tập tin theo kiểu MIME. Đầu vào: kiểu-nội-dung/kiểu-phụ hoặc kiểu-nội-dung/*, ví dụ <code>image/jpeg</code>.",
"mimetype": "Kiểu MIME:",
"download": "tải về",
"unwatchedpages": "Trang chưa được theo dõi",
"tooltip-summary": "Hãy nhập câu tóm lược",
"interlanguage-link-title": "$1 – $2",
"common.css": "/* Mã CSS đặt ở đây sẽ áp dụng cho mọi hình dạng */",
- "monobook.css": "/* Mã CSS đặt ở đây sẽ ảnh hưởng đến thành viên sử dụng hình dạng MonoBook */",
- "vector.css": "/* Mã CSS đặt ở đây sẽ ảnh hưởng đến thành viên sử dụng hình dạng Vectơ */",
"print.css": "/* Mã CSS tại đây sẽ ảnh hưởng đến bản để in */",
"noscript.css": "/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng tắt JavaScript */",
"group-autoconfirmed.css": "/* Mã CSS tại đây sẽ chỉ ảnh hưởng đến các thành viên tự động xác nhận */",
"group-sysop.css": "/* Mã CSS tại đây sẽ chỉ ảnh hưởng đến các bảo quản viên */",
"group-bureaucrat.css": "/* Mã CSS tại đây sẽ chỉ ảnh hưởng đến các hành chính viên */",
"common.js": "/* Bất kỳ mã JavaScript ở đây sẽ được tải cho tất cả các thành viên khi tải một trang nào đó lên. */",
- "monobook.js": "/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài MonoBook */",
- "vector.js": "/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài Vectơ */",
"group-autoconfirmed.js": "/* Mã JavaScript tại đây sẽ chỉ được tải cho các thành viên tự động xác nhận */",
"group-user.js": "/* Mã JavaScript tại đây sẽ chỉ được tải cho các thành viên có tài khoản */",
"group-bot.js": "/* Mã JavaScript tại đây sẽ chỉ được tải cho các bot */",
"pageinfo-category-pages": "Số trang",
"pageinfo-category-subcats": "Số thể loại con",
"pageinfo-category-files": "Số tập tin",
- "skinname-vector": "Vectơ",
"markaspatrolleddiff": "Đánh dấu tuần tra",
"markaspatrolledtext": "Đánh dấu tuần tra trang này",
"markedaspatrolled": "Đã đánh dấu tuần tra",
"version-hook-name": "Tên hook",
"version-hook-subscribedby": "Được theo dõi bởi",
"version-version": "(Phiên bản $1)",
+ "version-no-ext-name": "[không tên]",
"version-license": "Giấy phép MediaWiki",
"version-ext-license": "Giấy phép",
"version-ext-colheader-name": "Phần mở rộng",
"乌拉跨氪",
"十弌",
"아라",
- "Mywood"
+ "Mywood",
+ "Cwek"
]
},
"tog-underline": "鏈接下橫線:",
"qbmyoptions": "我頁",
"faq": "FAQ",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "加話題",
- "vector-action-delete": "刪",
- "vector-action-move": "移",
- "vector-action-protect": "保",
- "vector-action-undelete": "弗刪",
- "vector-action-unprotect": "换保护状态",
- "vector-view-create": "建",
- "vector-view-edit": "编",
- "vector-view-history": "望页史",
- "vector-view-view": "读",
- "vector-view-viewsource": "望源码",
"actions": "动作",
"namespaces": "名字空间",
"variants": "变量",
"enterlockreason": "请输入锁定个原因,包括预计解锁个辰光",
"readonlytext": "数据库目前禁止输入新内容及更改,\n箇蛮有可能是因为数据库拉许维修,完成仔即可恢复。\n\n管理员有如下解释:$1",
"missing-article": "数据库寻弗着想寻个页面文本:名字“$1”$2。\n\n箇一般是由于点击了链向旧有差异或历史个链接,而原有修订已拨删除导致个。\n\n如果弗是箇种情况,你侬作兴寻着软件里一个错误。畀URL地址记落来,搭[[Special:ListUsers/sysop|管理员]]报告。",
- "missingarticle-rev": "(修订#:$1)",
+ "missingarticle-rev": "(版本#:$1)",
"missingarticle-diff": "(两样:$1、$2)",
"readonly_lag": "从数据库服务器垃拉从主服务器上更新,数据库已经拨自动锁定",
"internalerror": "内部错误",
"editconflict": "编辑冲突: $1",
"explainconflict": "有人垃拉侬开始编辑之后更改仔页面。\n上头个文字框内显示个是箇歇本页个内容。\n侬个修改显示垃拉下底只文字框里向。\n侬应当拿侬个修改加入到现有个内容里向。\n<b>只有</b>上头文字框里向个内容会得垃侬点击\"保存页面\"之后畀保存。",
"yourtext": "侬个文字",
- "storedversion": "已保存修订版本",
+ "storedversion": "已保存版本",
"nonunicodebrowser": "'''警告:侬个浏览器弗兼容Unicode编码。'''箇搭有一只工作区将使侬可以安全编辑页面:非ASCII字符将以十六进制编码方式出现垃拉编辑框里向。",
"editingold": "''' 注意:倷勒里改动一只已经过期个页面修改。 如果倷保存俚个说话,勒拉该个修改之后个亨白浪当个修改侪会呒拨个。'''",
"yourdiff": "两样",
"language-converter-depth-warning": "字词转换器深度超限($1)",
"undo-success": "箇只编辑可以撤销。\n请检查下头个比较,确定侬确实想撤销,然后保存下底个更改完成撤销编辑。",
"undo-failure": "由于相互冲突个中途编辑,箇只编辑弗好撤销。",
- "undo-norev": "由于其修订版本弗存在或已删除,此编辑弗好撤销。",
- "undo-summary": "撤销由[[Special:Contributions/$2|$2]]([[User talk:$2|对话]])作出个修订$1",
+ "undo-norev": "由于其版本弗存在或已删除,此编辑弗好撤销。",
+ "undo-summary": "撤销由[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])作出个版本$1",
"cantcreateaccounttitle": "呒处建立帐户",
"cantcreateaccount-text": "从箇只IP地址 (<b>$1</b>) 创建账户已经畀[[User:$3|$3]]禁止。\n\n$3封禁个原因是''$2''",
"viewpagelogs": "望箇页日志",
"nohistory": "该只页面呒拨编辑历史。",
- "currentrev": "最新修订版本",
+ "currentrev": "最后版本",
"currentrev-asof": "于$1个最新修订版",
"revisionasof": "垃拉$1所作出个修订版",
- "revision-info": "垃拉$1由$2所作修订版本",
+ "revision-info": "垃拉$1由$2所作版本",
"previousrevision": "←还旧版",
"nextrevision": "新点个版本→",
- "currentrevisionlink": "最新修订",
+ "currentrevisionlink": "最后版本",
"cur": "当前",
"next": "后头",
"last": "上个",
"rev-deleted-user": "(用户名已删除)",
"rev-deleted-event": "(日志动作已删除)",
"rev-deleted-user-contribs": "[用户名或IP地址已删除 - 垃贡献里向囥脱编辑]",
- "rev-deleted-text-permission": "箇只页面修订已畀'''删除'''。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 删除日志]里向可以寻着详细信息。",
+ "rev-deleted-text-permission": "箇只页面版本已畀'''删除'''。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 删除日志]里向可以寻着详细信息。",
"rev-deleted-text-unhide": "箇只页面修订已经畀'''删除'''。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 删除日志]里向可以寻着详细信息。\n作为管理员,如果侬想继续个闲话,侬可以仍旧[$1 查看箇趟修订]。",
"rev-suppressed-text-unhide": "箇只页面修订已经畀'''废止'''。\n垃拉[{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} 废止日志]里向可以寻着详细信息。\n作为管理员,如果侬想继续个闲话,侬可以仍旧[$1 查看箇趟修订]。",
"rev-deleted-text-view": "箇只页面修订已经畀'''删除'''。作为管理员,侬可以查看渠;\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]里向可以寻着详细信息。",
"rev-suppressed-text-view": "箇只页面修订已经畀'''废止'''。作为管理员,侬可以查看渠;\n垃拉[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 废止日志]里向可以寻着详细信息。",
"rev-deleted-no-diff": "因为其中一趟修订已畀'''删除''',侬弗可以查看差异。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]里向可以寻着更多信息。",
- "rev-suppressed-no-diff": "箇只页面个其中一趟修订已经畀'''删除''',箇咾弗可以查看箇趟修订。",
+ "rev-suppressed-no-diff": "箇只页面个其中一趟版本已经畀'''删除''',箇咾弗可以查看箇趟版本。",
"rev-deleted-unhide-diff": "箇只页面个其中一趟修订已经畀'''删除'''。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]里向可以寻着更多信息。\n作为管理员,如果侬想继续个闲话,侬仍旧可以[$1 查看箇趟修订]。",
"rev-suppressed-unhide-diff": "箇只页面个其中一趟修订已经拨'''废止'''。\n垃拉[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 废止日志]里向可以寻着更多资料。\n作为管理员,如果侬想继续个闲话,侬可以仍旧[$1 查看箇趟修订]。",
"rev-deleted-diff-view": "差异里向个一趟修订已拨'''删除'''。\n作为管理员,侬可以查看箇个差异。详细信息可垃拉[{{fullurl: {{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]里向寻着。",
"rev-suppressed-diff-view": "差异里向个一趟修订已拨'''废止'''。\n作为管理员,侬可以查看箇个差异。详细信息可垃拉[{{fullurl: {{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 废止日志]里向寻着。",
"rev-delundel": "显示/囥脱",
"rev-showdeleted": "显示",
- "revisiondelete": "删除 / 反删除修订",
- "revdelete-nooldid-title": "无效个目标修订",
- "revdelete-nooldid-text": "侬还弗曾指定一个目标修订去进行箇只功能、\n所指定个修订弗存在,或者侬尝试去隐藏现时个修订。",
+ "revisiondelete": "删除 / 反删除版本",
+ "revdelete-nooldid-title": "无效个目标版本",
+ "revdelete-nooldid-text": "侬还弗曾指定一个目标版本去进行箇只功能、\n所指定个版本弗存在,或者侬尝试去隐藏现时个版本。",
"revdelete-no-file": "指定文件弗存在。",
- "revdelete-show-file-confirm": "侬阿是真个要查看文件“<nowiki>$1</nowiki>”垃拉$2 $3已经删除个修订?",
+ "revdelete-show-file-confirm": "侬阿是真个要查看文件“<nowiki>$1</nowiki>”垃拉$2 $3已经删除个版本?",
"revdelete-show-file-submit": "是",
"logdelete-selected": "选取$1个日志事件:",
"revdelete-confirm": "假使侬想箇能介做个闲话,请确认侬已经清爽箇能介做个后果,外加箇个程序符合[[{{MediaWiki:Policy-url}}|政策]]。",
"revdelete-log": "理由:",
"revdelete-submit": "应用于拣中个{{PLURAL:$1|修订}}",
"revdelete-success": "'''修订个可见性已经成功更新。'''",
- "revdelete-failure": "'''修订个可见性无法更新:'''\n$1",
+ "revdelete-failure": "<strong>版本个可见性无法更新:</strong>$1",
"logdelete-success": "'''事件个可见性已经成功设置。'''",
"logdelete-failure": "'''事件个可见性无法设置:'''\n$1",
"revdel-restore": "改变可见性",
"pagehist": "页面历史",
"deletedhist": "已删除之历史",
- "revdelete-hide-current": "隐藏于$1 $2之项目错误:箇个是当前个修订,弗可以隐藏。",
+ "revdelete-hide-current": "隐藏于$1 $2之项目错误:箇个是当前个版本,弗可以隐藏。",
"revdelete-show-no-access": "显示于$1 $2之项目错误:箇只项目已经标示为\"已限制\",侬对渠并无通行权。",
"revdelete-modify-no-access": "更改于$1 $2之项目错误:箇个项目已经标示为\"已限制\",侬对渠并无通行权。",
"revdelete-modify-missing": "更改项目ID $1错误:数据库里寻弗着!",
"revdelete-otherreason": "别个/附加理由:",
"revdelete-reasonotherlist": "别个理由",
"revdelete-edit-reasonlist": "编辑删除理由",
- "revdelete-offender": "修订作者:",
+ "revdelete-offender": "版本作者:",
"suppressionlog": "阻止日志",
"suppressionlogtext": "下头是只删除搭仔封锁列表,包括对管理员隐藏个内容。\n参看[[Special:IPBlockList|IP封锁名单]]来了解目前有效个禁止搭仔封锁之名单。",
"mergehistory": "合并页面历史",
"mergehistory-from": "来源页面:",
"mergehistory-into": "目的页面:",
"mergehistory-list": "可合并个编辑历史",
- "mergehistory-merge": "下头对[[:$1]]个修订可以合并到[[:$2]]。用该选项揿钮列去合并只有垃拉指定辰光前头创建个修订。要当心个是使用导航链接就会重设箇栏。",
+ "mergehistory-merge": "下头对[[:$1]]个版本可以合并到[[:$2]]。用该选项揿钮列去合并只有垃拉指定辰光前头创建个版本。要当心个是使用导航链接就会重设箇栏。",
"mergehistory-go": "显示可合并个编辑",
- "mergehistory-submit": "合并修订",
+ "mergehistory-submit": "合并版本",
"mergehistory-empty": "呒没修订可以合并",
"mergehistory-success": "[[:$1]]个$3趟修订已成功合并到[[:$2]]。",
"mergehistory-fail": "弗可以进行历史合并,请重新检查页面以及辰光参数。",
"pagemerge-logentry": "已拿[[$1]]合并到[[$2]] (修订截至$3)",
"revertmerge": "反合并",
"mergelogpagetext": "下底是只最近发生个页面历史合并个记录列表。",
- "history-title": "“$1”个修订史",
+ "history-title": "“$1”的版本历史",
"lineno": "第$1排:",
"compareselectedversions": "比较选中个版本",
"showhideselectedversions": "显示/囥脱选定修订版本",
"editundo": "撤销",
"searchresults": "搜寻结果",
"searchresults-title": "搜寻“$1”个结果",
- "toomanymatches": "匹配结果忒多哉,请尝试弗同个查询关键词",
"titlematches": "页面标题匹配",
"textmatches": "页面内容匹配",
"notextmatches": "呒没匹配个页面文本",
"tooltip-t-upload": "上传文件",
"tooltip-t-specialpages": "全部特殊页列表",
"tooltip-t-print": "箇页个打印版",
- "tooltip-t-permalink": "箇页当前修订版个老世链接",
+ "tooltip-t-permalink": "箇页当前版本个老世链接",
"tooltip-ca-nstab-main": "望内容页",
"tooltip-ca-nstab-user": "查看用户页",
"tooltip-ca-nstab-media": "查看媒体页",
"qbmyoptions": "מיינע בלעטער",
"faq": "מערסטע געפרעגטע פראגעס",
"faqpage": "Project:מערסטע געפרעגט פראגעס",
- "vector-action-addsection": "צושטעלן טעמע",
- "vector-action-delete": "אויסמעקן",
- "vector-action-move": "באַוועגן",
- "vector-action-protect": "שיצן",
- "vector-action-undelete": "מבטל זיין אויסמעקן",
- "vector-action-unprotect": "ענדערונג באַשיצונג",
- "vector-view-create": "שאַפֿן",
- "vector-view-edit": "רעדאַקטירן",
- "vector-view-history": "ווײַזן היסטאָריע",
- "vector-view-view": "לייענען",
- "vector-view-viewsource": "ווײַזן מקור",
"actions": "אַקציעס",
- "vector-more-actions": "נאך",
"namespaces": "נאָמענטיילן",
"variants": "װאַריאַנטן",
"navigation-heading": "נאוויגאציע מעניו",
"parser-template-recursion-depth-warning": "מוסטער רעקורסיע טיף מאקסימום איבערגעשטיגן ($1)",
"language-converter-depth-warning": "אַריבער דעם שפּראַך קאַנווערטער טיף לימיט ($1)",
"node-count-exceeded-category": "בלעטער וואו קנופצאל איז צו פיל",
+ "node-count-exceeded-category-desc": "א קאטעגאריע פאר בלעטער וואו די קנופצאל איז צו פיל.",
"node-count-exceeded-warning": "קנופנצאל אויפן בלאט צו הויך",
"expansion-depth-exceeded-category": "בלעטער וואו מ'האט אריבערגעשטיגן די פארברייטערונג טיף",
"expansion-depth-exceeded-category-desc": "דאס איז א קאטעגאריע פאר בלעטער וואס שטיגן איבער דער פארברייטערן־טיף.",
"revdelete-selected-file": "'''{{PLURAL:$1|אויסדערוויילטע טעקע ווערסיע| אויסדערוויילטע טעקע ווערסיעס}} פון [[:$2]]:'''",
"logdelete-selected": "{{PLURAL:$1| אויסדערוויילטע לאג אקציע|אויסדערוויילטע לאג אקציעס}}:",
"revdelete-text-text": "אויסגעמעקטע ווערסיעס וועלן נאך דערשיינען אין דער בלאט־היסטאריע, אבער טייל פון זייער אינהאלט וועט נישט זײַן צוגאנגבאר צום עולם.",
+ "revdelete-text-file": "אויסגעמעקטע טעקע ווערסיעס וועלן נאך דערשיינען אין דער בלאט־היסטאריע, אבער טייל פון זייער אינהאלט וועט נישט זײַן צוגאנגבאר צום עולם.",
+ "logdelete-text": "אויסגעמעקטע לאגביכער־געשעענישן וועלן נאך דערשיינען אינעם לאגבוך, אבער טייל פון זייער אינהאלט וועט נישט זײַן צוגאנגבאר צום עולם.",
"revdelete-confirm": "זייט אזוי גוט און באשטעטיקט אז דאס איז טאקע אייער כוונה, אז איר פארשטייט די קאנסעקווענצן, און אז איר טוט דאס לויט [[{{MediaWiki:Policy-url}}|דער פאליסי]].",
"revdelete-suppress-text": "אונטערדרוקן זאל בלויז גענוצט ווערן '''נאר''' אין די פאלגנדע פעלער:\n* אינפארמאציע וואס קען זיין מוציא שם רע\n* אויפדעקונג פון פריוואטקייט אינפארמאציע\n*: ''היים אדרעסן, טעלעפאן נומערן, נאציאנאלע אידענטיפיקאציע נומערן, א.א.וו.''",
"revdelete-legend": "שטעלט ווייזונג באגרענעצונגען",
"difference-missing-revision": "{{PLURAL:$2|איין ווערסיע|$2 ווערסיעס}} פון דעם דיפערענץ ($1) {{PLURAL:$2|האט}} מען נישט געטראפן.\n\nדאס געשעט געוויינלעך פון פאלגן א פארעלטערטן היסטאריע לינק צו א בלאט וואס איז געווארן אויסגעמעקט.\nפרטים קען מען געפינען אינעם [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} אויסמעקונג לאגבוך].",
"searchresults": "זוכן רעזולטאטן",
"searchresults-title": "זוכן רעזולטאַטן פֿאַר \"$1\"",
- "toomanymatches": "צו פֿיל רעזולטאַטן, ביטע פרואווט אן אנדער זוך",
"titlematches": "בלאט קעפל שטימט",
"textmatches": "בלעטער מיט פאַסנדיקן אינהאַלט",
"notextmatches": "נישטאָ קיין בלעטער מיט פאַסנדיקן אינהאַלט",
"largefileserver": "די טעקע איז גרעסער פונעם מאקסימום פאר דעם סערווער.",
"emptyfile": "די טעקע וואס איר האט ארויפֿלגעלאָדן איז ליידיג.\nעס קען זיין אז די סיבה איז פשוט א טייפא אינעם טעקע־נאמען.\nביטע קוקט איבער צי איר ווילט ארויפֿלאדן די דאזיקע טעקע.",
"windows-nonascii-filename": "די וויקי שטיצט נישט טעקע־נעמען מיט ספעציעלע צייכענען.",
- "fileexists": "א טעקע מיט דעם נאָמען עקזיסטירט שוין, ביטע זײַט בודק <strong>[[:$1]]</strong> ווען איר זענט נישט זיכער אַז איר ווילט זי ענדערן.\n[[$1|thumb]]",
+ "fileexists": "א טעקע מיט דעם נאָמען עקזיסטירט שוין, ביטע זײַט בודק <strong>[[:$1]]</strong> ווען {{GENDER:|איר}} זענט נישט זיכער אַז איר ווילט אים ענדערן.\n[[$1|thumb]]",
"filepageexists": "דער באשרייבונג בלאט פאר דער דאזיקער טעקע האט מען שוין געשאפן ביי <strong>[[:$1]]</strong>, אבער ס'עקזיסטירט נישט קיין טעקע מיט דעם נאמען.\nדי רעזומע וואס איר קלאפט אריין וועט זיך נישט באווייזן אויפן באשרייבונג בלאט.\nכדי צו שאפן אז אייער רעזומע וועט זיך טאקע באווייזן דארט, דארפט איר רעדאקטירן זי האנטווייז.\n[[$1|thumb]]",
"fileexists-extension": "א טעקע מיט אן ענלעכן נאמען עקזיסטירט שוין: [[$2|thumb]]\n* נאמען פון דער טעקע וואס ווערט ארויפגעלאָדן: <strong>[[:$1]]</strong>\n* נאמען פון דער פֿאראנענער טעקע: <strong>[[:$2]]</strong>\nזײַט אזוי גוט און קלויבט אן אנדער נאמען.",
"fileexists-thumbnail-yes": "די טעקע זעט אויס צו זײַן א פארקלענערט בילד ''(קליין)''.\n[[$1|thumb]]\nזײַט אזוי גוט קאנטראלירט די טעקע <strong>[[:$1]]</strong>.\nווען די קאנטראלירטע טעקע איז דאס זעלבע בילד אין דער אריגינעלער גרייס ברויכט מען נישט ארויפלאדן נאך א פארקלענערט בילד.",
"php-uploaddisabledtext": "אַרויפֿלאָדן טעקעס נישט דערמעגלעכט אין PHP.\nזייט אזוי גוט בודק זיין די file_uploads שטעלונג.",
"uploadscripted": "די טעקע האט א סקריפט אדער HTML קאד וואס קען ווערן פֿאלש אויסגעטייטשט דורך א בלעטערער",
"uploadscriptednamespace": "די SVG טעקע אנטהאלט אן אומלעגאלן נאמענטייל \"$1\"",
+ "uploadinvalidxml": "דאס XML אין דער ארויפגעלאדענער טעקע קען מען נישט פארזירן.",
"uploadvirus": "די טעקע האָט אַ ווירוס! פרטים: <div dir=\"rtl\">$1</div>",
"upload-source": "מקור טעקע",
"sourcefilename": "מקור טעקע נאמען:",
"upload-misc-error-text": "אן אומבאקאנטער גרייז האט פאסירט בשעת דעם ארויפלאד.\nביטע באשטעטיקט אז דער URL איז גילטיק און דערגרייכבאר און פרובירט נאכאמאל.\nווען דער פראבלעם בלייבט ווייטער, קאנטאקטירט א [[Special:ListUsers/sysop|סיסאפ]].",
"upload-too-many-redirects": "דער URL אַנטהאַלט צופֿיל ווײַטערפֿירונגען.",
"upload-http-error": "א HTTP גרײַז האט פאַסירט: $1",
+ "upload-copy-upload-invalid-domain": "ארויפלאדן טעקעס פון דעם דאמיין נישט מעגלעך.",
"backend-fail-stream": "קען נישט מאכן שטראמען טעקע $1.",
"backend-fail-notexists": "נישט פֿאראן די טעקע $1.",
"backend-fail-notsame": "א נישט־אידענטישע טעקע עקזיסטירט שוין ביי \"$1\".",
"wantedtemplates": "געזוכטע מוסטערן",
"mostlinked": "מערסט פֿארבינדענע בלעטער",
"mostlinkedcategories": "מערסט פֿארבינדענע קאטעגאריעס",
- "mostlinkedtemplates": "×\9eערס×\98 פֿ×\90ר×\91×\99× ×\93×¢× ×¢ ×\9e×\95ס×\98ער×\9f",
+ "mostlinkedtemplates": "×\9eערס×\98 ×\90ר×\99×\91ער×\92×\9c×¢×©×¢×¡×¢× ×¢ ×\91×\9c×¢×\98ער",
"mostcategories": "אַרטיקלען מיט די מערסטע קאַטעגאָריעס",
"mostimages": "מערסט פֿארבונדענע טעקעס",
"mostinterwikis": "בלעטער מיט די מערסטע אינטערוויקיס",
"listgrouprights-namespaceprotection-header": "נאמענטייל באשרענקונגען",
"listgrouprights-namespaceprotection-namespace": "נאָמענטייל",
"listgrouprights-namespaceprotection-restrictedto": "רעכט(ן) וואס דערלויבט באניצער צו רעדאקטירן",
+ "trackingcategories": "אויפפאסן־קאטעגאריעס",
+ "trackingcategories-msg": "אויפפאסן־קאטעגאריע",
"trackingcategories-name": "מעלדונג נאמען",
"trackingcategories-desc": "קאטעגאריע אײַנשליסן קריטעריע",
"trackingcategories-nodesc": "נישט פאראן קיין באשרײַבונג.",
"prot_1movedto2": "[[$1]] אריבערגעפירט צו [[$2]]",
"protect-badnamespace-title": "אומשיצבארער נאמענטייל",
"protect-badnamespace-text": "בלעטער אין דעם נאמענטייל קען מען נישט שיצן.",
+ "protect-norestrictiontypes-text": "מען קען נישט שיצן דעם בלאט ווײַל עס זענען נישט פאראן קיין באשרענקונג־טיפן.",
"protect-norestrictiontypes-title": "נישט־שיצבארער בלאט",
"protect-legend": "באַשטעטיגן שיץ",
"protectcomment": "אורזאַך:",
"sp-contributions-newbies-sub": "פאר נייע קאנטעס",
"sp-contributions-newbies-title": "בײַשטײַערונגען פֿון נײַע באַניצערס",
"sp-contributions-blocklog": "בלאקירן לאג",
+ "sp-contributions-suppresslog": "אונטערדריקטע באַניצער בײַשטײַערונגען",
"sp-contributions-deleted": "אויסגעמעקטע באַניצער בײַשטײַערונגען",
"sp-contributions-uploads": "אַרויפֿלאָדונגען",
"sp-contributions-logs": "לאגביכער",
"ipboptions": "2 שעהן:2 hours,\n1 טאָג:1 day,\n3 טעג:3 days,\n1 װאָך:1 week,\n2 װאָכן:2 weeks,\n1 מאָנאַט:1 month,\n3 מאָנאַטן:3 months,\n6 מאָנאַטן:6 months,\n1 יאָר:1 year,\nאויף אייביק:infinite",
"ipbhidename": "באַהאַלטן באַניצער נאָמען פֿון רעדאַקטירונגען און רשימות",
"ipbwatchuser": "אויפֿפאַסן דעם באַניצערס באַניצער און רעדן בלעטער",
+ "ipb-disableusertalk": "פארמײַדן דעם באניצער פון רעדאקטירן זײַן אייגענעם רעדן בלאט בשעת ער איז בלאקירט",
+ "ipb-change-block": "ווידער-בלאקירן דעם באניצער מיט די דאזיקע אײַנשטעלונגען",
"ipb-confirm": "באַשטעטיקן בלאָק",
"badipaddress": "נישט קיין גוטער IP אַדרעס.",
"blockipsuccesssub": "בלאק איז דורכגפירט מיט דערפֿאלג",
"ipb_expiry_temp": "בלאקירן מיט פאַרבאָרגן באַניצער נאָמען מוז זייַן אויף אייביק.",
"ipb_hide_invalid": "נישט געקענט פֿאַרשטיקן די קאנטע; זי האט {{PLURAL:$1|איין רעדאקטירונג|$1 רעדאַקטירונגען}}.",
"ipb_already_blocked": "\"$1\" איז שוין בלאקירט",
- "ipb-needreblock": "$1 ×\90×\99×\96 ש×\95×\99×\9f ×\91×\9c×\90ק×\99ר×\98. צ×\99 ×\95×\95×\99×\9c×\98 ×\90×\99ר ×\98×\95×\99ש×\9f ×\93×\99 ×\91×\90ַצ×\99×\99×\9b× ונגען?",
+ "ipb-needreblock": "$1 ×\90×\99×\96 ש×\95×\99×\9f ×\91×\9c×\90ק×\99ר×\98. צ×\99 ×\95×\95×\99×\9c×\98 ×\90×\99ר ×\98×\95×\99ש×\9f ×\93×\99 ×\90×²Ö·× ×©×\98×¢×\9cונגען?",
"ipb-otherblocks-header": "{{PLURAL:$1|אנדער בלאקירונג|אנדערע בלאקירונגען}}",
"unblock-hideuser": "איר קענט נישט אומבלאקירן דעם באניצער, ווײַל זײַן באַניצער נאָמען איז פֿאַרבארגן.",
"ipb_cant_unblock": "גרײַז: בלאק ID $1 נישט געפֿונען.\nס'מעגליך שוין געווארן באַפֿרייט.",
"tooltip-preferences-save": "היטן פרעפֿערענצן",
"tooltip-summary": "אײַנגעבן א קורצע רעזומע",
"common.css": "/* CSS געשריבן דא וועט אפילירן און באיינפלוסן אלע סקינס */",
- "monobook.css": "/* סטייל דא געלייגט וועט באאיינפלוסן דעם Monobook סקין */",
- "vector.css": "/* CSS געשטעלט דא ווירקט נאר אויפן וועקטאר סקין */",
"common.js": "/* אלע סקריפטן פון JavaScript דא געשריבן וועט לויפן פאר אלע באנוצער ווען זיי וועלן לאדירן דעם בלאט */",
"anonymous": "{{PLURAL:$1|אַנאנימער באַניצער| אַנאנימע באַניצערס}} פֿון {{SITENAME}}",
"siteuser": "באַניצער {{SITENAME}} $1",
"pageinfo-category-pages": "צאָל בלעטער",
"pageinfo-category-subcats": "צאָל אונטערקאטעגאריעס",
"pageinfo-category-files": "צאָל טעקעס",
- "skinname-monobook": "מאנאבוק",
- "skinname-vector": "וועקטאר",
"markaspatrolleddiff": "באצייכענען אלס פאטראלירט",
"markaspatrolledtext": "באצייכענען בלאט אלס פאטראלירט",
"markedaspatrolled": "באצייכנט אלס פאטראלירט",
"qbmyoptions": "Àwọn ojúewé mi",
"faq": "FAQ",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "Àfikún orí-ọ̀rọ̀",
- "vector-action-delete": "Ìparẹ́",
- "vector-action-move": "Ìyípòdà",
- "vector-action-protect": "Àbò",
- "vector-action-undelete": "Ìmúkúrò ìparẹ́",
- "vector-action-unprotect": "Ìyípadà àbò",
- "vector-view-create": "Ṣ'èdá",
- "vector-view-edit": "Àtúnṣe",
- "vector-view-history": "Wo ìtàn",
- "vector-view-view": "Àwòkà",
- "vector-view-viewsource": "Wo àmìọ̀rọ̀",
"actions": "Àwọn ìgbéṣe",
"namespaces": "Àwọn orúkọàyè",
"variants": "Àwọn oriṣiríṣi",
"difference-missing-revision": "{{PLURAL:$2|Àtúnyẹ̀wò kan|Àwọn àtúnyẹ̀wò $2}} ìyàtọ̀ yìí ($1) kò {{PLURAL:$2|sí|sí}}.\n\nÈyí ṣẹlẹ̀ nítorí pé ẹ tẹ̀lé àjápọ̀ ìyàtọ̀ tí kò ṣiṣẹ́ mọ́ wá sí ojúewé tó ti jẹ́ píparẹ́.\nẸ̀kúnrẹ́rẹ́ wà nínú [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} àkọọ́lẹ̀ ìparẹ́].",
"searchresults": "Àwọn èsì àwárí",
"searchresults-title": "Àwọn èsì àwárí fún \"$1\"",
- "toomanymatches": "Àwọn ìbáramu ti pọ̀jù, ẹ jọ̀wọ́ ẹ gbìyànjú lọ́nà mìíràn",
"titlematches": "Àkọlé ojúewé báramu",
"textmatches": "Ọ̀rọ̀ ojúewé tóbáramu:",
"notextmatches": "Kò sí ọ̀rọ̀ ojúewé tóbáramu",
"Cwek",
"아라",
"Ktchankt",
- "Kc kennylau"
+ "Kc kennylau",
+ "Mywood"
]
},
"tog-underline": "連結加底線:",
"tog-hidepatrolled": "響最近修改度隱藏巡查過嘅編輯",
"tog-newpageshidepatrolled": "響新頁清單度隱藏巡查過嘅版",
"tog-extendwatchlist": "展開監視清單去顯示全部更改,唔係淨係最新嘅",
- "tog-usenewrc": "用強化版最近更改(需要JavaScript)",
+ "tog-usenewrc": "最近修改同監視清單顯示群組修改",
"tog-numberheadings": "標題自動編號",
"tog-showtoolbar": "顯示修改工具列",
"tog-editondblclick": "撳兩下改嘢",
- "tog-editsectiononrightclick": "可以撳右掣更改個別段落(需要JavaScript)",
- "tog-watchcreations": "將我開嘅頁加入監視清單",
- "tog-watchdefault": "將我修改嘅頁加入監視清單",
- "tog-watchmoves": "將我移動嘅頁加入監視清單",
- "tog-watchdeletion": "將我刪除嘅頁加入監視清單",
+ "tog-editsectiononrightclick": "可以撳右掣更改個別段落",
+ "tog-watchcreations": "å°\87æ\88\91é\96\8bå\98\85é \81å\90\8cä¸\8aå\82³å\98\85æª\94æ¡\88å\8a å\85¥ç\9b£è¦\96æ¸\85å\96®",
+ "tog-watchdefault": "å°\87æ\88\91ä¿®æ\94¹å\98\85é \81å\90\8cæª\94æ¡\88å\8a å\85¥ç\9b£è¦\96æ¸\85å\96®",
+ "tog-watchmoves": "å°\87æ\88\91移å\8b\95å\98\85é \81å\90\8cæª\94æ¡\88å\8a å\85¥ç\9b£è¦\96æ¸\85å\96®",
+ "tog-watchdeletion": "å°\87æ\88\91å\88ªé\99¤å\98\85é \81å\90\8cæª\94æ¡\88å\8a å\85¥ç\9b£è¦\96æ¸\85å\96®",
"tog-minordefault": "預設全部編輯做小修改",
"tog-previewontop": "喺修改欄上方顯示預覽",
"tog-previewonfirst": "第一次修改時顯示預覽",
- "tog-enotifwatchlistpages": "當響我張監視清單度嘅頁面有修改時電郵通知我",
+ "tog-enotifwatchlistpages": "當響我張監視清單度嘅頁面同檔案有修改時電郵通知我",
"tog-enotifusertalkpages": "個人留言版有修改時電郵通知我",
- "tog-enotifminoredits": "小修改都要電郵通知我",
+ "tog-enotifminoredits": "頁面同檔案小修改都要電郵通知我",
"tog-enotifrevealaddr": "喺電郵通知信上面話畀人聽我嘅電郵地址",
"tog-shownumberswatching": "顯示有幾多人監視",
"tog-oldsig": "現有簽名:",
"tog-fancysig": "將簽名以維基字對待(冇自動連結)",
- "tog-uselivepreview": "用即時預覽(需要JavaScript)(實驗緊)",
+ "tog-uselivepreview": "用即時預覽(實驗緊)",
"tog-forceeditsummary": "我冇入修改註解時通知我",
"tog-watchlisthideown": "響監視清單度隱藏我嘅編輯",
"tog-watchlisthidebots": "響監視清單度隱藏機械人嘅編輯",
"newwindow": "(響新視窗度打開)",
"cancel": "取消",
"moredotdotdot": "更多...",
- "mypage": "我嘅頁",
+ "mypage": "版",
"mytalk": "傾偈",
"anontalk": "同呢個 IP 傾偈",
"navigation": "導覽",
"qbmyoptions": "我嘅選項",
"faq": "FAQ",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "加主題",
- "vector-action-delete": "剷走",
- "vector-action-move": "搬",
- "vector-action-protect": "保護",
- "vector-action-undelete": "取消剷走",
- "vector-action-unprotect": "解除保護",
- "vector-view-create": "開",
- "vector-view-edit": "改",
- "vector-view-history": "睇吓歷史",
- "vector-view-view": "閱",
- "vector-view-viewsource": "睇吓原始碼",
"actions": "動作",
"namespaces": "空間名",
"variants": "變換",
+ "navigation-heading": "導覽選單",
"errorpagetitle": "出錯",
"returnto": "返去$1 。",
"tagline": "出自{{SITENAME}}",
"history_short": "歷史",
"updatedmarker": "我上次來之後嘅修改",
"printableversion": "可打印版本",
- "permalink": "永久連結",
+ "permalink": "固定連結",
"print": "印",
"view": "去睇",
+ "view-foreign": "用 $1 睇",
"edit": "改",
+ "edit-local": "改本地說明",
"create": "開",
+ "create-local": "加本地說明",
"editthispage": "改呢版",
"create-this-page": "建立呢頁",
"delete": "剷走",
"deletethispage": "剷走呢版",
+ "undeletethispage": "反刪呢一版",
"undelete_short": "取消剷走$1次修改",
"viewdeleted_short": "去睇$1次刪除咗嘅修改",
"protect": "保護",
"protect_change": "改",
"protectthispage": "保護呢頁",
- "unprotect": "解除保護",
- "unprotectthispage": "解除保護",
+ "unprotect": "改保護",
+ "unprotectthispage": "改呢版保護",
"newpage": "開新頁",
"talkpage": "討論呢版",
"talkpagelinktext": "傾偈",
"articlepage": "睇目錄",
"talk": "討論",
"views": "去睇",
- "toolbox": "工具箱",
+ "toolbox": "架撐",
"userpage": "去睇用戶頁",
"projectpage": "去睇專題頁",
"imagepage": "去睇檔案頁",
"jumptonavigation": "定向",
"jumptosearch": "搵嘢",
"view-pool-error": "對唔住,個伺服器響呢段時間超出咗負荷。\n太多用戶試過去睇呢一版。\n響再睇呢一版之前請等多一陣。\n\n$1",
+ "generic-pool-error": "對唔住,個伺服器響呢段時間超出咗負荷。\n太多用戶試過去睇呢一版。\n響再睇呢一版之前請等多一陣。",
"pool-timeout": "等死鎖超時",
"pool-queuefull": "隊池已滿",
"pool-errorunknown": "未知嘅錯誤",
+ "pool-servererror": "用唔到程序計數服務 ($1)。",
"aboutsite": "關於{{SITENAME}}",
"aboutpage": "Project:關於",
- "copyright": "é\9f¿版度嘅內容係根據$1嘅條款發佈。",
+ "copyright": "é\99¤é\9d\9eå\8f¦å¤\96è¬\9bæ\98\8eï¼\8cé\9f¿å\91¢版度嘅內容係根據$1嘅條款發佈。",
"copyrightpage": "{{ns:project}}:版權",
"currentevents": "最近發生嘅事",
"currentevents-url": "Project:最近發生嘅事",
"ok": "OK",
"retrievedfrom": "由 \"$1\" 收",
"youhavenewmessages": "你有$1($2)。",
- "newmessageslinkplural": "新訊息",
+ "youhavenewmessagesfromusers": "你有{{PLURAL:$3|另一位用戶|$3 位用戶}}畀你嘅 $1 ($2)。",
+ "youhavenewmessagesmanyusers": "你有好多位用戶畀你嘅 $1 ($2)。",
+ "newmessageslinkplural": "{{PLURAL:$1|一個新訊息|999=新訊息}}",
+ "newmessagesdifflinkplural": "最近{{PLURAL:$1|修改}}",
"youhavenewmessagesmulti": "你響 $1 有新信",
"editsection": "編輯",
"editold": "編輯",
"page-rss-feed": "\"$1\"嘅RSS Feed",
"page-atom-feed": "\"$1\"嘅Atom Feed",
"red-link-title": "$1 (頁面未存在)",
+ "sort-descending": "倒轉排",
+ "sort-ascending": "順序排",
"nstab-main": "版",
"nstab-user": "用戶頁",
"nstab-media": "媒體頁",
"nospecialpagetext": "<strong>無你所要求嘅特別頁。</strong>\n\n喺[[Special:SpecialPages|{{int:specialpages}}]]有全部用得嘅特別頁。",
"error": "錯誤",
"databaseerror": "資料庫錯誤",
+ "databaseerror-text": "資料庫查詢出錯。\n可能係個系統有問題。",
+ "databaseerror-textcl": "資料庫查詢出錯。",
+ "databaseerror-query": "查詢: $1",
+ "databaseerror-function": "功能: $1",
+ "databaseerror-error": "出錯: $1",
"laggedslavemode": "警告:呢頁可能未包括最新嘅更新。",
"readonly": "資料庫鎖咗",
"enterlockreason": "輸入鎖資料庫嘅原因,同埋預計幾耐後會解鎖",
"formerror": "錯誤:表格交唔到",
"badarticleerror": "喺呢頁唔可以做呢個動作。",
"cannotdelete": "頁或檔案 \"$1\" 唔刪得。\n可能已經畀另一位刪咗。",
+ "cannotdelete-title": "刪唔到 \"$1\"",
+ "delete-hook-aborted": "編輯由鈎取消咗。\n佢無畀到解釋。",
+ "no-null-revision": "唔可以對 \"$1\" 開個新嘅空白修改",
"badtitle": "錯嘅標題",
"badtitletext": "要求嘅標題唔啱、空白,跨語言或者跨維基連結標題錯誤。亦可能係標題包括咗一個或多過一個字元。",
- "perfcached": "以下嘅資料係嚟自快取,可能唔係最新嘅。 A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
- "perfcachedts": "以下嘅資料係嚟自快取,上一次嘅更新喺$1。 A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+ "perfcached": "以下嘅資料係嚟自快取,可能唔係最新嘅。 最多有{{PLURAL:$1|一個結果|$1個結果}}響快取度。",
+ "perfcachedts": "以下嘅資料係嚟自快取,上一次嘅更新喺$1。 最多有{{PLURAL:$4|一個結果|$4個結果}}響快取度。",
"querypage-no-updates": "響呢一頁嘅更新現時停用。啲資料將唔會即時更新。",
"viewsource": "睇吓原始碼",
+ "viewsource-title": "睇 $1 嘅原碼",
"actionthrottled": "動作已壓制",
"actionthrottledtext": "基於反垃圾嘢嘅考量,你而家響呢段短時間之內限制咗去做呢一個動作,而你已經超過咗個上限。請響幾分鐘之後再試過。",
- "protectedpagetext": "呢一頁已經保護咗唔畀改。",
+ "protectedpagetext": "呢一版已經保護咗唔畀改或者做其他動作。",
"viewsourcetext": "你可以睇吓或者複製呢一頁嘅原始碼:",
- "protectedinterface": "呢一頁提供軟件嘅介面文字,呢一頁已經保護咗以預防濫用。",
- "editinginterface": "'''警告:'''你而家編輯緊嘅呢一個用嚟提供介面文字嘅頁面。響呢一頁嘅更改會影響到其他用戶使用中嘅介面外觀。要翻譯,請考慮利用[//translatewiki.net/wiki/Main_Page?setlang=yue translatewiki.net],一個用來為MediaWiki軟件本地化嘅計劃。",
+ "viewyourtext": "你可以睇同複製呢版入面<strong>由你改</strong>嘅原碼:",
+ "protectedinterface": "呢一頁提供軟件嘅介面文字,呢一頁已經保護咗以預防濫用。\n要加或者改所有維基站嘅翻譯,請去 [//translatewiki.net/ translatewiki.net]嘅 MediaWiki 本地化項目。",
+ "editinginterface": "'''警告:'''你而家編輯緊嘅呢一個用嚟提供介面文字嘅頁面。響呢一頁嘅更改會影響到其他用戶使用中嘅介面外觀。要加或者改所有維基站嘅翻譯,請去 [//translatewiki.net/ translatewiki.net]嘅 MediaWiki 本地化項目。",
"cascadeprotected": "呢一版已經保護咗唔能夠編輯,因為佢係響以下嘅{{PLURAL:$1|一|幾}}頁度包含咗,當中啟用咗\"連串\"保護選項來保護嗰一版: $2",
"namespaceprotected": "你無權編輯響'''$1'''空間名裏面嘅呢一版。",
+ "customcssprotected": "你無權改呢版CSS,因為佢包含其他用戶嘅個人設定。",
+ "customjsprotected": "你無權改呢版JavaScript,因為佢包含其他用戶嘅個人設定。",
+ "mycustomcssprotected": "你無權改呢版CSS。",
+ "mycustomjsprotected": "你無權改呢版JavaScript。",
+ "myprivateinfoprotected": "你無權改呢版你嘅私人資料。",
+ "mypreferencesprotected": "你無權改呢版你嘅個人設定。",
"ns-specialprotected": "特別頁係唔可以編輯嘅。",
"titleprotected": "呢個標題已經俾[[User:$1|$1]]保護咗防止去開。原因係''$2''。",
+ "filereadonlyerror": "改唔到檔案 \"$1\",因為檔案庫 \"$2\" 而家係唯讀。\n\n負責鎖嘅管理員嘅解釋:\"$3\"。",
+ "invalidtitle-knownnamespace": "名域 \"$2\" 同版名 \"$3\" 無效嘅標題",
+ "invalidtitle-unknownnamespace": "未知名域號碼 \"$1\" 同版名 \"$2\" 無效嘅標題",
+ "exception-nologin": "未簽到",
+ "exception-nologin-text": "請[[Special:Userlogin|簽到]]之後先至睇或者改呢版。",
+ "exception-nologin-text-manual": "請$1之後先至睇或者改呢版。",
"virus-badscanner": "壞設定: 未知嘅病毒掃瞄器: ''$1''",
"virus-scanfailed": "掃瞄失敗 (代碼 $1)",
"virus-unknownscanner": "未知嘅防病毒:",
- "logouttext": "'''你而家已經登出咗。'''\n\n你重可以用匿名身份用{{SITENAME}},又或者<span class='plainlinks'>[$1 重新登入]</span>。\n但係留意某啲頁面可能會繼續話你未登入,除非等你清除瀏覽器嘅快取儲存。",
+ "logouttext": "<strong>你而家已經簽退咗。</strong>\n\n但係留意某啲頁面可能會繼續話你未登入,除非等你清除瀏覽器嘅快取儲存。",
+ "welcomeuser": "歡迎,$1!",
+ "welcomecreation-msg": "你個戶口已經起好。\n唔好唔記得去改改你嘅{{SITENAME}}[[Special:Preferences|喜好設定]]喎。",
"yourname": "用戶名:",
+ "userlogin-yourname": "用戶名",
+ "userlogin-yourname-ph": "入用戶名",
+ "createacct-another-username-ph": "入用戶名",
"yourpassword": "密碼:",
+ "userlogin-yourpassword": "密碼",
+ "userlogin-yourpassword-ph": "入密碼",
+ "createacct-yourpassword-ph": "入密碼",
"yourpasswordagain": "再輸入密碼:",
+ "createacct-yourpasswordagain": "確認密碼",
+ "createacct-yourpasswordagain-ph": "入多次密碼",
"remembermypassword": "響呢個瀏覽器度記住我嘅登入資料 (最高維持$1{{PLURAL:$1|日|日}})",
+ "userlogin-remembermypassword": "記住我有簽到",
+ "userlogin-signwithsecure": "用安全連線",
"yourdomainname": "你嘅網域:",
+ "password-change-forbidden": "你唔可以改呢個維基站嘅密碼。",
"externaldberror": "驗證資料庫出錯,或者唔允許你更新你嘅外部帳戶。",
"login": "登入",
"nav-login-createaccount": "登入/開新戶口",
"logout": "登出",
"userlogout": "登出",
"notloggedin": "未登入",
+ "userlogin-noaccount": "重未有戶口?",
+ "userlogin-joinproject": "入{{SITENAME}}",
"nologin": "重未有戶口? $1。",
"nologinlink": "開個新戶口",
"createaccount": "開戶口",
"gotaccountlink": "登入",
"userlogin-resetlink": "唔記得簽到資料?",
"userlogin-resetpassword-link": "唔記得密碼?",
+ "userlogin-helplink2": "幫我簽到",
+ "userlogin-loggedin": "您目前用{{GENDER:$1|$1}}身份簽到,\n請用下面表格用另一身份簽到。",
"userlogin-createanother": "開過個戶口",
"createacct-emailrequired": "電郵地址",
- "createaccountmail": "用電郵",
+ "createacct-emailoptional": "電郵地址(可以唔填)",
+ "createacct-email-ph": "入電郵地址",
+ "createacct-another-email-ph": "入電郵地址",
+ "createaccountmail": "將臨時密碼送到指定電郵地址",
+ "createacct-realname": "真名(可以唔填)",
"createaccountreason": "原因:",
+ "createacct-reason": "原因",
"createacct-reason-ph": "開過個戶口嘅原因",
+ "createacct-captcha": "安全檢查",
+ "createacct-imgcaptcha-ph": "入你下面見到嘅字",
"createacct-submit": "開戶口",
+ "createacct-another-submit": "開過個戶口",
+ "createacct-benefit-heading": "{{SITENAME}}係由你同其他人貢獻。",
+ "createacct-benefit-body1": "{{PLURAL:$1|次編輯|次編輯}}",
+ "createacct-benefit-body2": "{{PLURAL:$1|版|版}}",
+ "createacct-benefit-body3": "最近{{PLURAL:$1|貢獻者|貢獻者}}",
"badretype": "你入嘅密碼唔一致。",
- "userexists": "你入嘅用戶名已經有人用咗,唔該揀過個名啦。",
+ "userexists": "你入嘅用戶名已經有人用咗。\n唔該揀過個名啦。",
"loginerror": "登入錯誤",
+ "createacct-error": "開戶口出錯",
"createaccounterror": "開唔到戶口:$1",
"nocookiesnew": "已經開咗戶口,但你未登入。 {{SITENAME}} 要用 cookies 嚟登入。你已經熄咗佢。請你開咗再試。",
"nocookieslogin": "{{SITENAME}} 登入要開 cookies。熄咗佢。請你開咗再試。",
"noemailcreate": "你需要提供一個有效嘅電郵地址",
"passwordsent": "新嘅密碼已經寄咗畀呢位用戶 \"$1\" 嘅電郵地址。收到之後請重新登入。",
"blocked-mailpassword": "你嘅IP地址被鎖住,唔可以用密碼復原功能以防止濫用。",
- "eauthentsent": "確認電郵已經傳送到指定嘅電郵地址。喺其它嘅郵件傳送到呢個戶口之前,你需要按電郵嘅指示,嚟確認呢個戶口真係屬於你嘅。",
+ "eauthentsent": "確認電郵已經傳送到指定嘅電郵地址。\n喺其它嘅郵件傳送到呢個戶口之前,你需要按電郵嘅指示,嚟確認呢個戶口真係屬於你嘅。",
"throttled-mailpassword": "一個密碼提醒已經響$1{{PLURAL:$1|個鐘頭}}之前發送咗。為咗防止濫用,響$1{{PLURAL:$1|個鐘頭}}之內只可以發送一個密碼提醒。",
"mailerror": "傳送電郵錯誤: $1",
"acct_creation_throttle_hit": "利用你呢個IP地址嘅訪客響上一日已經開咗 $1 個戶口,係響呢段時間嘅上限。\n結果,利用呢個IP地址嘅訪客唔可以響呢段時間再開多個戶口。",
"emailauthenticated": "你嘅電郵地址已經喺 $2 $3 確認。",
- "emailnotauthenticated": "你嘅電郵地址重未確認。 任何傳送電郵嘅功能都唔會運作。",
+ "emailnotauthenticated": "你嘅電郵地址重未確認。\n任何傳送電郵嘅功能都唔會運作。",
"noemailprefs": "響你嘅喜好設定度設置一個電郵地址令到呢啲功能開始運作。",
"emailconfirmlink": "確認你嘅電郵地址",
"invalidemailaddress": "呢個電郵地址嘅格式唔啱,所以接受唔到。請輸入一個啱格式嘅地址,或清咗嗰個空格。",
+ "cannotchangeemail": "你唔改得呢個維基站嘅戶口電郵地址。",
+ "emaildisabled": "呢個站送唔到電郵出去。",
"accountcreated": "戶口已經建立咗",
- "accountcreatedtext": "$1嘅戶口起好咗。",
+ "accountcreatedtext": "[[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|討論]])嘅戶口起好咗。",
"createaccount-title": "響{{SITENAME}}度開個新戶口",
"createaccount-text": "有人響{{SITENAME}}度用咗你個電郵開咗個名叫 \"$2\" 嘅新戶口 ($4),密碼係 \"$3\" 。你應該而家登入,改埋個密碼。\n\n如果個戶口係開錯咗嘅話,你可以唔埋呢篇信。",
- "login-throttled": "你已經試咗太多次登入動作。請等多一陣再試過。",
+ "login-throttled": "你已經試咗太多次簽到動作。\n請等$1再試過。",
+ "login-abort-generic": "你簽到失敗",
"loginlanguagelabel": "語言:$1",
"suspicious-userlogout": "你去登出嘅要求已經拒絕咗,因為佢可能由壞咗嘅瀏覽器或者快取代理傳送。",
+ "createacct-another-realname-tip": "真名可以唔填。\n如果你畀埋佢,有需要嘅時候會用佢來標示你嘅工夫。",
+ "pt-login": "簽到",
+ "pt-login-button": "簽到",
"pt-createaccount": "開戶口",
+ "pt-userlogout": "簽走",
"php-mail-error-unknown": "響 PHP 嘅 mail() 參數度出現咗未知嘅錯誤",
+ "user-mail-no-addy": "試過唔用電郵地址去送出電郵。",
+ "user-mail-no-body": "試過無寫或者太短嘅內文去送出電郵。",
"changepassword": "改密碼",
- "resetpass_announce": "你已經用咗一個臨時電郵碼登入。要完成登入,你一定要響呢度定一個新嘅密碼:",
+ "resetpass_announce": "要完成簽到,你一定要響呢度定一個新嘅密碼:",
"resetpass_text": "<!-- 響呢度加入文字 -->",
"resetpass_header": "改戶口密碼",
"oldpassword": "舊密碼:",
"newpassword": "新密碼:",
"retypenew": "打多次新密碼:",
"resetpass_submit": "設定密碼同登入",
- "changepassword-success": "你嘅密碼已經成功噉改咗!\n而家幫你登入緊...",
+ "changepassword-success": "你嘅密碼已經成功噉改咗!",
+ "changepassword-throttled": "你已經試咗太多次簽到動作。\n請等$1再試過。",
"resetpass_forbidden": "唔可以更改密碼",
"resetpass-no-info": "你一定要登入咗去直接入來呢一版。",
"resetpass-submit-loggedin": "改密碼",
"resetpass-submit-cancel": "取消",
"resetpass-wrong-oldpass": "無效嘅臨時或現有嘅密碼。\n你可能已經成功咁更改你嘅密碼,又或者重新請求過一個新嘅臨時密碼。",
+ "resetpass-recycled": "請你設過個同而家唔同嘅密碼。",
+ "resetpass-temp-emailed": "你用電郵入面嘅臨時密碼簽到。\n要完成簽到動作,就要設過個新密碼:",
"resetpass-temp-password": "臨時密碼:",
+ "resetpass-abort-generic": "改密碼嘅動作已經畀擴充套件停咗。",
+ "resetpass-expired": "你個密碼經已過期。請設過個新密碼。",
+ "resetpass-expired-soft": "你個密碼經已過期要設過。請揀個新密碼,或者去\"{{int:resetpass-submit-cancel}}\" 轉頭再設過。",
+ "resetpass-validity-soft": "你個密碼無效: $1\n\n請揀個新密碼,或者去\"{{int:resetpass-submit-cancel}}\" 轉頭再設過。",
"passwordreset": "密碼重設",
+ "passwordreset-text-one": "填好呢份表格去申請將臨時密碼經電郵送畀你。",
+ "passwordreset-text-many": "{{PLURAL:$1|填其中一欄去申請將臨時密碼經電郵送畀你。}}",
"passwordreset-legend": "重設密碼",
+ "passwordreset-disabled": "呢個維基站無得設過密碼。",
+ "passwordreset-emaildisabled": "呢個維基站無得傳送電郵。",
"passwordreset-username": "用戶名:",
"passwordreset-domain": "域名:",
+ "passwordreset-capture": "睇電郵內容?",
+ "passwordreset-capture-help": "如果揀呢度,電郵連臨時密碼金向你顯示,同時會送畀用戶。",
"passwordreset-email": "電郵地址:",
+ "passwordreset-emailtitle": "{{SITENAME}}嘅戶口資料",
"passwordreset-emailelement": "用戶名:$1\n臨時密碼:$2",
+ "passwordreset-emailsent": "密碼重設電郵經已送出。",
+ "passwordreset-emailsent-capture": "密碼重設電郵經已送出,下面有顯示。",
+ "passwordreset-emailerror-capture": "密碼重設電郵經已送出,下面有顯示,但送畀{{GENDER:$2|user}}時失敗: $1",
"changeemail": "改電郵地址",
+ "changeemail-header": "改戶口電郵地址",
+ "changeemail-text": "填呢份表去改戶口電郵地址。你需要入密碼確認改動。",
+ "changeemail-no-info": "你一定要簽到咗去直接入來呢一版。",
+ "changeemail-oldemail": "而家個電郵地址:",
+ "changeemail-newemail": "新電郵地址:",
+ "changeemail-none": "(冇)",
+ "changeemail-password": "你{{SITENAME}}個密碼:",
"changeemail-submit": "轉電郵",
"changeemail-cancel": "取消",
"changeemail-throttled": "你試咗登入太多次,請喺$1後再試過。",
+ "resettokens": "重設密匙",
+ "resettokens-text": "您可以重設有關你戶口私隱資料嘅密匙。\n\n如果你唔小心洩漏密匙,或者戶口畀人入侵,就要重設密匙。",
+ "resettokens-no-tokens": "呢度無密匙可以重設。",
+ "resettokens-legend": "重設密匙",
+ "resettokens-tokens": "密匙:",
+ "resettokens-token-label": "$1 (而家個值:$2)",
+ "resettokens-watchlist-token": "訂[[Special:Watchlist|監視清單]] Atom/RSS 嘅密匙",
+ "resettokens-done": "密匙已經重設。",
+ "resettokens-resetbutton": "重設指定密匙",
"bold_sample": "粗體字",
"bold_tip": "粗體字",
"italic_sample": "斜體字",
"loginreqlink": "登入",
"loginreqpagetext": "你一定$1去睇其它嘅頁面。",
"accmailtitle": "密碼寄咗喇。",
- "accmailtext": "「[[User talk:$1|$1]]」嘅隨機產生密碼已經寄咗去 $2。\n\n呢個新戶口嘅密碼可以響登入咗之後嘅''[[Special:ChangePassword|改密碼]]''版度改佢。",
+ "accmailtext": "「[[User talk:$1|$1]]」嘅隨機產生密碼已經寄咗去 $2。\n\n呢個密碼可以響簽到咗之後嘅<em>[[Special:ChangePassword|改密碼]]</em> 版度改佢。",
"newarticle": "(新)",
"newarticletext": "你連連過嚟嘅頁面重未存在。\n要起版新嘅,請你喺下面嗰格度輸入。(睇睇[$1 自助版]拎多啲資料。)\n如果你係唔覺意嚟到呢度,撳一次你個瀏覽器'''返轉頭'''個掣。",
"anontalkpagetext": "----''呢度係匿名用戶嘅討論頁,佢可能係重未開戶口,或者佢重唔識開戶口。我哋會用數字表示嘅IP地址嚟代表佢。一個IP地址係可以由幾個用戶夾來用。如果你係匿名用戶,同覺得呢啲留言係同你冇關係嘅話,唔該去[[Special:UserLogin/signup|開一個新戶口]]或[[Special:UserLogin|登入]],避免喺以後嘅留言會同埋其它用戶混淆。''",
"userpage-userdoesnotexist": "用戶戶口\"<nowiki>$1</nowiki>\"重未開。請響䦒/編輯呢版之前先檢查一下。",
"userpage-userdoesnotexist-view": "用戶戶口\"$1\"重未開。",
"blocked-notice-logextract": "呢位用戶而家被封鎖緊。\n下面有最近嘅封鎖紀錄以供參考:",
- "clearyourcache": "'''注意:喺儲存之後,你可能要先略過你嘅瀏覽器快取去睇到更改。'''\n'''Mozilla / Firefox / Safari:''' 㩒住''Shift''掣再撳''重新載入'',又或者㩒''Ctrl-F5''或者''Ctrl-R''(喺Mac㩒''Command-R''掣);\n'''Konqueror:''' 就咁以撳個''重載''掣,又或者㩒''F5'';\n'''Opera:'''喺''工具→喜好設定''之中清佢哋嘅快取,又或者㩒''Alt-F5'';\n'''Internet Explorer:''' 㩒住''Ctrl''掣再撳''重新整理'',又或者㩒''Ctrl-F5''掣。",
+ "clearyourcache": "<strong>注意</strong>:喺儲存之後,你可能要先略過你嘅瀏覽器快取去睇到更改。\n*<strong>Firefox / Safari:</strong> 㩒住<em>Shift<em>掣再撳<em>重新載入</em>,又或者㩒<em>Ctrl-F5</em>或者<em>Ctrl-R</em>(喺Mac㩒<em>Command-R</em>掣);\n*<strong>Google Chrome:</strong> 㩒<em>Ctrl-Shift-R</em>(喺Mac㩒<em>Command-R</em>掣);\n*<strong>Internet Explorer:</strong> 㩒住<em>Ctrl</em>掣再撳<em>重新整理</em>,又或者㩒<em>Ctrl-F5</em>掣;\n*<strong>Opera:</strong>喺<em>工具→喜好設定</em>之中清佢哋嘅快取。",
"usercssyoucanpreview": "'''提示:'''響儲存前,用「{{int:showpreview}}」個掣嚟測試你嘅新CSS。",
"userjsyoucanpreview": "'''提示:'''響儲存前,用「{{int:showpreview}}」個掣嚟測試你嘅新JavaScript。",
"usercsspreview": "'''記住你而家只係預覽緊你嘅用戶CSS樣式表。'''\n'''佢嘅內容重未儲存!'''",
"token_suffix_mismatch": "'''因為你嘅用戶端度嘅編輯幣整壞咗一啲標點符號字元,你嘅編輯已經拒絕咗。'''個編輯已經拒絕,以防止嗰版嘅文字損毀。\n當你響度用緊一啲好多臭蟲,以網絡為主嘅匿名代理服務。",
"edit_form_incomplete": "'''編輯表格嘅某個部份同server唔夾,請檢查多次你嘅編輯同埋再試多次。'''",
"editing": "而家喺度編輯$1",
+ "creating": "開版$1",
"editingsection": "而家喺度編輯$1 (小節)",
"editingcomment": "而家喺度編輯$1 (新小節)",
"editconflict": "編輯衝突:$1",
"yourdiff": "差異",
"copyrightwarning": "請留意喺{{SITENAME}}度,所有喺呢度嘅貢獻會被考慮到喺$2之下發出(睇$1有更詳細嘅資訊)。如果你係唔想你編輯嘅文字無喇喇咁被分發,咁就唔好喺呢度遞交。\n\n你亦都要同我哋保證啲文字係你自己寫嘅,或者係由公有領域或相似嘅自由資源複製落嚟。\n'''喺未有任何許可嘅情況之下千祈唔好遞交有版權嘅作品!'''",
"copyrightwarning2": "請留意喺{{SITENAME}}度,所有嘅貢獻可能會被其他嘅貢獻者編輯、修改,或者刪除。如果你係唔想你編輯嘅文字無喇喇咁被編輯,咁就唔好喺呢度遞交。\n\n你亦都要同我哋保證啲文字係你自己寫嘅,或者係由公有領域或相似嘅自由資源複製落嚟(睇$1有更詳細嘅資訊)。\n'''喺未有任何許可嘅情況之下千祈唔好遞交有版權嘅作品!'''",
- "longpageerror": "'''錯誤:你所遞交嘅文字係有 $1 kilobytes 咁長,係長過最大嘅 $2 kilobytes。'''儲唔到你遞交嘅文字。",
- "readonlywarning": "'''錯誤:料庫已經鎖住咗,以便定期保養。而家你唔可以儲起你嘅編輯。'''你可以儲啲文字落一份文字檔先。\n\n管理員嘅解釋: $1",
+ "longpageerror": "<strong>出錯:你所遞交嘅文字係有 {{PLURAL:$1|1 KB|$1 KB}} 咁長,長過最大嘅 {{PLURAL:$2|1 KB|$2 KB}}。</strong>\n儲唔到你遞交嘅文字。",
+ "readonlywarning": "<strong>警告:資料庫已經鎖住咗去做定期保養。而家你唔可以儲起你嘅編輯。</strong>\n\n你可以儲啲文字落一份文字檔先。\n\n管理員嘅解釋: $1",
"protectedpagewarning": "'''警告:呢版已經受到保護,只有管理員權限嘅用戶先至可以改。'''\n最近嘅日誌響下面提供以便參考:",
"semiprotectedpagewarning": "'''注意:'''呢一頁已經保護咗,只有已經註冊嘅用戶先至可以改。\n最近嘅日誌響下面提供以便參考:",
"cascadeprotectedwarning": "'''警告:'''呢一頁已經保護咗,只有管理員權限嘅用戶先至可以改,因為佢係響以下連串保護嘅{{PLURAL:$1|一|幾}}頁度包含咗:",
"nocreate-loggedin": "你並無許可權去開新版。",
"sectioneditnotsupported-title": "唔支援逐改段",
"sectioneditnotsupported-text": "呢版唔支援逐改段。",
- "permissionserrors": "權限錯誤",
+ "permissionserrors": "權限出錯",
"permissionserrorstext": "根據下面嘅{{PLURAL:$1|原因|原因}},你並無權限去做呢樣嘢:",
"permissionserrorstext-withaction": "根據下面嘅{{PLURAL:$1|原因|原因}},你並無權限去做$2:",
"recreate-moveddeleted-warn": "'''警告: 你而家重開一版係先前曾經刪除過嘅。'''\n\n你應該要考慮吓繼續編輯呢一版係唔係適合嘅。\n為咗方便起見,呢一版嘅刪除同搬版記錄已經響下面提供:",
"edit-gone-missing": "唔能夠更新頁。\n佢可能啱啱刪除咗。",
"edit-conflict": "編輯衝突。",
"edit-no-change": "你嘅編輯已經略過,因為文字無改過。",
+ "postedit-confirmation-created": "呢版經已開咗。",
+ "postedit-confirmation-restored": "呢版經已恢復咗。",
+ "postedit-confirmation-saved": "呢版經已儲存咗。",
"edit-already-exists": "唔可以開一新版。\n佢已經存在。",
+ "defaultmessagetext": "預設訊息文字",
"editwarning-warning": "離開呢一版會令到你嘅修改唔見咗。\n你可以響你嘅喜好設定嘅\"{{int:prefs-editing}}\"小節度停用呢個警告。",
"expensive-parserfunction-warning": "警告: 呢一版有太多耗費嘅語法功能呼叫。\n\n佢應該少過$2次呼叫,佢而家係$1次呼叫。",
"expensive-parserfunction-category": "響版度有太多嘅耗費嘅語法功能呼叫",
"diff-multi-manyusers": "(由$2位更多用戶所做嘅$1個中途修訂冇顯示到)",
"searchresults": "搵嘢結果",
"searchresults-title": "對\"$1\"嘅搵嘢結果",
- "toomanymatches": "太多嘅配合搵到,請試吓一個唔同嘅查詢",
"titlematches": "頁面標題符合",
"textmatches": "頁面文字符合",
"notextmatches": "冇頁面文字符合",
"action-userrights-interwiki": "編輯響其它wiki用戶嘅權限",
"action-siteadmin": "鎖同解鎖資料庫",
"nchanges": "$1次更改",
- "recentchanges": "æ\9c\80è¿\91æ\9b´æ\94¹",
+ "recentchanges": "æ\9c\80è¿\91æ\94¹é\81\8eå\98\85å\98¢",
"recentchanges-legend": "最近更改選項",
"recentchanges-summary": "追蹤對哩一個 wiki 嘅最後更改。",
"recentchanges-feed-description": "追蹤對哩一個 wiki 度呢個集合嘅最後更改。",
"ipblocklist-submit": "搵",
"ipblocklist-localblock": "本地封鎖",
"ipblocklist-otherblocks": "其他{{PLURAL:$1|封鎖|封鎖}}",
- "infiniteblock": "無期限",
+ "infiniteblock": "無期",
"expiringblock": "$1 $2 期滿",
"anononlyblock": "只限匿名",
"noautoblockblock": "自動封鎖已經停用",
"tooltip-preferences-save": "保存設定",
"tooltip-summary": "輸入一個簡短嘅摘要",
"common.css": "/* 響呢度放 CSS 碼來改成個網站嘅畫面 */",
- "monobook.css": "/* 響呢度放 CSS 碼去改用戶用嘅 Monobook 畫面 */",
- "vector.css": "/* 響呢度放 CSS 碼去改用戶用嘅域達畫面 */",
"print.css": "/* 響呢度放 CSS 碼去改打印輸出 */",
"common.js": "/* 響每一次個頁面載入時,所有用戶都會載入呢度任何嘅JavaScript。 */",
- "monobook.js": "/* 響每一次個頁面載入時,用 Monobook 畫面嘅用戶都會載入呢度任何嘅JavaScript */",
- "vector.js": "/* 響每一次個頁面載入時,用域達畫面嘅用戶都會載入呢度任何嘅JavaScript */",
"anonymous": "{{SITENAME}}嘅匿名{{PLURAL:$1|用戶|用戶}}",
"siteuser": "{{SITENAME}}嘅用戶$1",
"anonuser": "{{SITENAME}}嘅匿名用戶$1",
"spam_reverting": "恢復返去最後一個唔包含指去$1嘅連結嘅嗰個修訂。",
"spam_blanking": "全部版本都含有指去$1嘅連結,留空",
"simpleantispam-label": "反垃圾檢查。\n'''唔好'''加入呢個!",
- "skinname-monobook": "MonoBook",
- "skinname-vector": "Vector",
"markaspatrolleddiff": "標示為已巡查嘅",
"markaspatrolledtext": "標示呢版做查咗嘅",
"markedaspatrolled": "已經標示做已巡查嘅",
"qbmyoptions": "我的页面",
"faq": "常见问题",
"faqpage": "Project:常见问题",
- "vector-action-addsection": "添加话题",
- "vector-action-delete": "删除",
- "vector-action-move": "移动",
- "vector-action-protect": "保护",
- "vector-action-undelete": "还原",
- "vector-action-unprotect": "更改保护",
- "vector-view-create": "创建",
- "vector-view-edit": "编辑",
- "vector-view-history": "查看历史",
- "vector-view-view": "阅读",
- "vector-view-viewsource": "查看源代码",
"actions": "操作",
- "vector-more-actions": "更多",
"namespaces": "名字空间",
"variants": "变种",
"navigation-heading": "导航菜单",
"history_short": "历史",
"updatedmarker": "更新于我上次访问后",
"printableversion": "打印版本",
- "permalink": "永久链接",
+ "permalink": "固定链接",
"print": "打印",
"view": "查看",
"view-foreign": "在$1查看",
"readonly": "数据库被锁定",
"enterlockreason": "请输入锁定的原因(包括预计解锁的时间)",
"readonlytext": "数据库当前被锁定,不能添加新条目或进行其他修改,锁定可能是因为例行的数据库维护,完成后即可恢复正常。\n\n锁定数据库的管理员提供的解释:$1",
- "missing-article": "数据库找不到预期的页面文字:“$1”$2。\n\n这通常是由于点击了链向旧有差异或历史的链接,而原有修订已被删除导致的。\n\n如果情况不是这样,您可能找到了软件的一个内部错误。请记录下URL地址,并向[[Special:ListUsers/sysop|管理员]]报告。",
+ "missing-article": "数据库找不到预期的页面文字:“$1”$2。\n\n这通常是由于点击了链向旧有差异或历史的链接,而原有版本已被删除导致的。\n\n如果情况不是这样,您可能找到了软件的一个内部错误。请记录下URL地址,并向[[Special:ListUsers/sysop|管理员]]报告。",
"missingarticle-rev": "(版本#:$1)",
"missingarticle-diff": "(差异:$1,$2)",
"readonly_lag": "附属数据库服务器正在将缓存更新到主服务器上,数据库已被自动锁定",
"cannotdelete": "无法删除页面或图像“$1”。\n它可能已被其他人删除了。",
"cannotdelete-title": "无法删除“$1”",
"delete-hook-aborted": "删除被扩展钩子取消。钩子并没有给出解释。",
- "no-null-revision": "无法创建对\"$1\"页面新的空白修订",
+ "no-null-revision": "无法创建对\"$1\"页面新的空白版本",
"badtitle": "错误标题",
"badtitletext": "所请求页面的标题是无效的、不存在,跨语言或跨wiki链接的标题错误。它可能包含一个或更多的不能用于标题的字符。",
"perfcached": "以下是缓存的数据,可能不是最新的数据。缓存中最多有{{PLURAL:$1|$1条结果}}。",
"anontalkpagetext": "---- ''这是一个还未建立账户的匿名用户的讨论页, 因此我们只能用IP地址来与他或她联络。该IP地址可能由几名用户共享。如果您是一名匿名用户并认为此页上的评语与您无关,请[[Special:UserLogin/signup|创建新账户]]或[[Special:UserLogin|登录]]以避免在未来与其他匿名用户混淆。''",
"noarticletext": "本页面目前没有内容。你可以在其他页面中[[Special:Search/{{PAGENAME}}|搜索本页标题]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索相关日志]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 编辑本页面]。</span>",
"noarticletext-nopermission": "本页面目前没有内容。你可以在其他页面中[[Special:Search/{{PAGENAME}}|搜索本页标题]]或<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索相关日志]</span>,但你没有权限创建本页面。",
- "missing-revision": "“{{FULLPAGENAME}}”的修订#$1不存在。\n\n这通常是因为进入了一个已被删除的页面的历史链接。\n详细信息可以在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
+ "missing-revision": "“{{FULLPAGENAME}}”的版本#$1不存在。\n\n这通常是因为进入了一个已被删除的页面的历史链接。\n详细信息可以在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
"userpage-userdoesnotexist": "用户账户“$1”没有注册。请在创建/编辑本页前检查。",
"userpage-userdoesnotexist-view": "用户账户“$1”没有被注册。",
"blocked-notice-logextract": "这位用户目前已被封禁。以下提供最近的封禁日志以供参考:",
"undo-norev": "该编辑无法撤消,因为它不存在或已被删除。",
"undo-nochange": "这次编辑似乎已被撤销。",
"undo-summary": "撤销[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])的版本$1",
- "undo-summary-username-hidden": "取消由一匿名用户所作的修订$1",
+ "undo-summary-username-hidden": "取消由一匿名用户所作的版本$1",
"cantcreateaccounttitle": "无法创建账户",
"cantcreateaccount-text": "从该IP地址('''$1''')创建账户已被[[User:$3|$3]]禁止。\n\n$3的理由是''$2''",
"cantcreateaccount-range-text": "从该IP地址段'''$1'''的账户创建已被[[User:$3|$3]]禁止,而这也包括了您的IP地址('''$4''')。\n$3给出的原因是“$2”。",
"previousrevision": "←上一版本",
"nextrevision": "下一版本→",
"currentrevisionlink": "最后版本",
- "cur": "现",
+ "cur": "当前",
"next": "后继",
- "last": "前",
+ "last": "前一",
"page_first": "首页",
"page_last": "末页",
"histlegend": "差异选择:选中要对比的版本的单选按钮,按Enter键或下方的按钮。<br />\n说明:<strong>({{int:cur}})</strong>=与最后版本之间的差异,<strong>({{int:last}})</strong>=与上一版本之间的差异,<strong>{{int:minoreditletter}}</strong>=小编辑。",
"rev-deleted-user-contribs": "[用户名或IP地址被删除 - 编辑在贡献中隐藏]",
"rev-deleted-text-permission": "本页面版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
"rev-deleted-text-unhide": "本页面版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。如果你想继续操作,你仍然可以[$1 查看本版本]。",
- "rev-suppressed-text-unhide": "该页面修订已经被'''监督隐藏'''。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。如果您想继续的话,您可以仍然[$1 去查看这次修订]。",
+ "rev-suppressed-text-unhide": "该页面版本已经被'''监督隐藏'''。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。如果您想继续的话,您可以仍然[$1 去查看这次版本]。",
"rev-deleted-text-view": "本页面版本已被'''删除'''。你可以查看它,详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
- "rev-suppressed-text-view": "该页面修订已经被'''监督隐藏'''。您可以查看它。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。",
+ "rev-suppressed-text-view": "该页面版本已经被'''监督隐藏'''。您可以查看它。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。",
"rev-deleted-no-diff": "你不能查看该差异,因为其中一个版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
"rev-suppressed-no-diff": "你不能查看该差异,因为其中一个版本已被'''删除'''。",
- "rev-deleted-unhide-diff": "该差异对比其中的一个修订版本已经被'''删除'''。在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中可以找到更多的信息。如果您想继续的话,您仍然可以[$1 查看这次修订]。",
- "rev-suppressed-unhide-diff": "该页面的其中一次修订已经被'''监督隐藏'''。\n在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到更多的资料。如果您想继续的话,您可以仍然[$1 去查看这次修订]。",
- "rev-deleted-diff-view": "差异对比中的一次修订已被'''删除'''。您可以对比此差异。详细信息可在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
- "rev-suppressed-diff-view": "差异对比中的一次修订已被'''监督隐藏'''。您可以对比此差异。详细信息可在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中找到。",
+ "rev-deleted-unhide-diff": "该差异对比其中的一个版本已经被'''删除'''。在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中可以找到更多的信息。如果您想继续的话,您仍然可以[$1 查看这版本]。",
+ "rev-suppressed-unhide-diff": "该页面的其中一次版本已经被'''监督隐藏'''。\n在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到更多的资料。如果您想继续的话,您可以仍然[$1 去查看这版本]。",
+ "rev-deleted-diff-view": "差异对比中的一次版本已被'''删除'''。您可以对比此差异。详细信息可在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
+ "rev-suppressed-diff-view": "差异对比中的一个版本已被'''监督隐藏'''。您可以对比此差异。详细信息可在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中找到。",
"rev-delundel": "显示/隐藏",
"rev-showdeleted": "显示",
"revisiondelete": "删除/还原版本",
"revdelete-nooldid-title": "无效目标版本",
- "revdelete-nooldid-text": "您尚未指定一个目标修订去进行这个功能、\n所指定的修订不存在,或者您尝试去隐藏现时的修订。",
+ "revdelete-nooldid-text": "您尚未指定一个目标版本去进行这个功能、所指定的版本不存在,或者您尝试去隐藏现时的版本。",
"revdelete-no-file": "指定的文件不存在。",
"revdelete-show-file-confirm": "确定要查看文件“<nowiki>$1</nowiki>”于$2$3被删除的版本吗?",
"revdelete-show-file-submit": "是",
"revdelete-selected-text": "已选择[[:$2]]的$1个版本:",
"revdelete-selected-file": "已选择文件[[:$2]]的$1个版本:",
"logdelete-selected": "{{PLURAL:$1|选取的日志项目}}:",
- "revdelete-text-text": "已删除修订仍将在页面历史中显示,但涉及部分的内容将对公众不可见。",
+ "revdelete-text-text": "已删除版本仍将在页面历史中显示,但涉及部分的内容将对公众不可见。",
"revdelete-text-file": "已删除文件版本仍将在文件历史中显示,但涉及部分的内容将对公众不可见。",
"logdelete-text": "已删除日志事件仍将在日志中显示,但涉及部分的内容将对公众不可见。",
"revdelete-text-others": "在{{SITENAME}}的其他管理员仍将可以访问隐藏内容,并在一定条件下能够通过相同界面取消删除,除非附加条件被设定。",
"revdelete-confirm": "请确认该操作,明白其后果,并确保该操作符合[[{{MediaWiki:Policy-url}}|方针]]。",
"revdelete-suppress-text": "阻止应'''仅'''用于以下情况:\n* 潜在的诽谤信息\n* 不合适的个人信息\n*: ''家庭地址、电话号码和社保号码等。''",
"revdelete-legend": "设置可见性之限制",
- "revdelete-hide-text": "修订文字",
+ "revdelete-hide-text": "版本文字",
"revdelete-hide-image": "隐藏文件内容",
"revdelete-hide-name": "隐藏动作和目标",
"revdelete-hide-comment": "编辑摘要",
"revdelete-radio-set": "隐藏",
"revdelete-radio-unset": "可见",
"revdelete-suppress": "同时阻止管理员与其他用户查看数据",
- "revdelete-unsuppress": "在已恢复的修订中移除限制",
+ "revdelete-unsuppress": "在已恢复的版本中移除限制",
"revdelete-log": "原因:",
"revdelete-submit": "应用于选中的{{PLURAL:$1|版本}}",
- "revdelete-success": "<strong>修订版本可见性更新成功。</strong>",
- "revdelete-failure": "<strong>修订版本可见性无法更新:</strong>\n$1",
+ "revdelete-success": "<strong>版本可见性更新成功。</strong>",
+ "revdelete-failure": "<strong>版本可见性无法更新:</strong>$1",
"logdelete-success": "'''事件的可见性已经成功设置。'''",
"logdelete-failure": "'''事件的可见性无法设置:'''\n$1",
"revdel-restore": "更改可见性",
"pagehist": "页面历史",
"deletedhist": "已删除历史",
- "revdelete-hide-current": "正在隐藏于$1 $2之项目错误:这个是现时的修订,不可以隐藏。",
+ "revdelete-hide-current": "隐藏$1 $2的项出错:这个是当前的版本,不可以隐藏。",
"revdelete-show-no-access": "正在显示于$1 $2之项目错误:这个项目已经标示为\"已限制\",您对它并无通行权。",
"revdelete-modify-no-access": "正在更改于$1 $2之项目错误:这个项目已经标示为\"已限制\",您对它并无通行权。",
"revdelete-modify-missing": "正在更改项目ID $1错误:它在资料库中遗失!",
"suppressionlog": "监督日志",
"suppressionlogtext": "该列表列出了管理员隐藏的删除与封禁。另参见[[Special:BlockList|封禁列表]]查询当前的封禁列表。",
"mergehistory": "合并页面历史",
- "mergehistory-header": "这一页可以让您将来源页面的修订历史合并到新页面中去。\n请确保此次更改能继续保持历史页面的连续性。",
- "mergehistory-box": "合并两个页面的修订历史:",
+ "mergehistory-header": "这一页可以让您将来源页面的版本合并到新页面中去。请确保此次更改能继续保持历史页面的连续性。",
+ "mergehistory-box": "合并两个页面的版本历史:",
"mergehistory-from": "来源页面:",
"mergehistory-into": "目的页面:",
"mergehistory-list": "可以合并的编辑历史",
"mergehistory-empty": "没有可以合并的版本。",
"mergehistory-success": "[[:$1]]的$3个版本成功合并至[[:$2]]。",
"mergehistory-fail": "不可以进行历史合并,请重新检查该页面以及时间参数。",
+ "mergehistory-fail-toobig": "由于超出$1的限制而无法执行历史合并,$1个版本将被移动。",
"mergehistory-no-source": "来源页面$1不存在。",
"mergehistory-no-destination": "目的页面$1不存在。",
"mergehistory-invalid-source": "来源页面必须是一个有效的标题。",
"diff-multi-sameuser": "(未显示同一用户的$1个中间版本)",
"diff-multi-otherusers": "(未显示{{PLURAL:$1|另一用户|$2个用户}}的{{PLURAL:$1|$1个中间版本}})",
"diff-multi-manyusers": "(未显示超过$2个用户的$1个中间版本)",
- "difference-missing-revision": "此差异对比的{{PLURAL:$2|一个修订|$2个修订}}($1){{PLURAL:$2|没有}}找到。\n\n这通常是因为进入了一个已被删除的页面的修订差异对比链接。\n详细信息可以在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
+ "difference-missing-revision": "此差异对比的{{PLURAL:$2|$2个版本}}($1){{PLURAL:$2|没有}}找到。\n\n这通常是因为进入了一个已被删除的页面的版本差异对比链接。\n详细信息可以在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
"searchresults": "搜索结果",
"searchresults-title": "“$1”的搜索结果",
- "toomanymatches": "找到的匹配结果过多,请尝试不同的查询词",
"titlematches": "页面标题匹配",
"textmatches": "页面内容匹配",
"notextmatches": "没有页面内容匹配",
"searchprofile-images-tooltip": "搜索文件",
"searchprofile-everything-tooltip": "搜索所有内容(包括讨论页面)",
"searchprofile-advanced-tooltip": "在自定义名字空间中搜索",
- "search-result-size": "$1($2字)",
+ "search-result-size": "$1($2个字)",
"search-result-category-size": "$1个成员($2个子分类,$3个文件)",
"search-result-score": "相关度:$1%",
"search-redirect": "(重定向自“$1”)",
"recentchangesdays-max": "最多$1天",
"recentchangescount": "默认显示的编辑数:",
"prefs-help-recentchangescount": "这包括最近更改、页面历史和日志。",
- "prefs-help-watchlist-token2": "这是你的监视列表的网络feed的密钥。任何知道它的人均可以阅读你的监视列表,因此请不要分享它。如果需要,[[Special:ResetTokens|你可以重置它]]。",
+ "prefs-help-watchlist-token2": "这是您的监视列表的网络feed密钥。\n任何拥有者均可以浏览您的监视列表,因此不要公开该密钥。\n如果有需要,[[Special:ResetTokens|您可以重置密钥]]。",
"savedprefs": "您的系统设置已保存。",
"timezonelegend": "时区:",
"localtime": "当地时间:",
"yourvariant": "内容语言变种:",
"prefs-help-variant": "您希望用于显示该本站内容的语言变体。",
"yournick": "新签名:",
- "prefs-help-signature": "讨论页面上的评论应该使用“<nowiki>~~~~</nowiki>”签名,它会自动转换为您的签名及时间戳。",
+ "prefs-help-signature": "讨论页上留言应该使用“<nowiki>~~~~</nowiki>”签名,它会自动转换为您的签名及时间戳。",
"badsig": "错误的原始签名。请检查HTML标签。",
"badsiglength": "签名过长。请不超过$1个字符。",
"yourgender": "您希望使用什么性别称呼?",
"email": "电子邮件",
"prefs-help-realname": "真实姓名是选填项目。如果你选择提供它,它将会用于贡献署名。",
"prefs-help-email": "电子邮件地址是选填项,但是当你忘记你的密码要重置密码时,需要该信息。",
- "prefs-help-email-others": "你也可以选择让其他用户通过你的用户或讨论页面上的链接用电子邮件联系你。其他用户联系你时你的电子邮件地址不会显示。",
+ "prefs-help-email-others": "您也可以选择让其他用户通过您的用户页或讨论页上的链接用电子邮件联系您。其他用户联系您时您的电子邮件地址不会显示。",
"prefs-help-email-required": "电子邮件地址是必填项目。",
"prefs-info": "基本信息",
"prefs-i18n": "语言",
"rcshowhidemine-show": "显示",
"rcshowhidemine-hide": "隐藏",
"rclinks": "显示过去$2天的最后$1个更改<br />$3",
- "diff": "异",
- "hist": "史",
+ "diff": "å·®å¼\82",
+ "hist": "å\8e\86å\8f²",
"hide": "隐藏",
"show": "显示",
"minoreditletter": "小",
"allarticles": "所有页面",
"allinnamespace": "所有页面($1名字空间)",
"allpagessubmit": "提交",
- "allpagesprefix": "显示页面的前缀:",
+ "allpagesprefix": "显示有该前缀的页面:",
"allpagesbadtitle": "给定的页面标题是非法的,或者具有一个内部语言或内部 wiki 的前缀。它可能包含一个或更多的不能用于标题的字符。",
"allpages-bad-ns": "在{{SITENAME}}中没有一个叫做\"$1\"的名字空间。",
"allpages-hide-redirects": "隐藏重定向",
"categoriesfrom": "显示分类开始于:",
"special-categories-sort-count": "按数量排列",
"special-categories-sort-abc": "按字母排列",
- "deletedcontributions": "已被删除的用户贡献",
- "deletedcontributions-title": "已被删除的用户贡献",
+ "deletedcontributions": "被删除的用户贡献",
+ "deletedcontributions-title": "被删除的用户贡献",
"sp-deletedcontributions-contribs": "贡献",
"linksearch": "外部链接搜索",
"linksearch-pat": "搜索网址:",
"unwatch": "取消监视",
"unwatchthispage": "停止监视",
"notanarticle": "非内容页面",
- "notvisiblerev": "上次由不同用户所作的修订版本已经删除",
- "watchlist-details": "不计讨论页,您的监视列表中共有$1个页面。",
+ "notvisiblerev": "上次由不同用户所作的版本已经删除",
+ "watchlist-details": "不计讨论页,您的监视列表中有$1个页面。",
"wlheader-enotif": "已启用电子邮件通知。",
"wlheader-showupdated": "您上次访问后发生更改的页面'''加粗'''显示",
- "wlnote2": "下面是过去{{PLURAL:$1|<strong>$1</strong>小时}}的更改,截至$2 $3。",
+ "wlnote2": "下面是最近{{PLURAL:$1|<strong>$1</strong>小时}}的更改,截至$2 $3。",
"wlshowlast": "显示过去$1小时$2天$3",
"watchlist-options": "监视列表选项",
"watching": "正在监视...",
"exbeforeblank": "被清空前的内容为:“$1”",
"delete-confirm": "删除“$1”",
"delete-legend": "删除",
- "historywarning": "警告:您将要删除的页面有约$1个{{PLURAL:$1|修订}}版本的历史:",
+ "historywarning": "警告:您将要删除的页面有约$1个{{PLURAL:$1|版本}}的历史:",
"confirmdeletetext": "您即将删除一个页面或图像以及其历史。\n请确定您要进行此项操作,并且了解其后果,同时您的行为符合[[{{MediaWiki:Policy-url}}]]。",
"actioncomplete": "操作完成",
"actionfailed": "操作失败",
"deletereasonotherlist": "其他原因",
"deletereason-dropdown": "*常见删除原因\n**广告\n**破坏行为\n**侵犯著作权\n**作者申请\n**受损重定向",
"delete-edit-reasonlist": "编辑删除原因",
- "delete-toobig": "这个页面有一个十分大量的编辑历史,超过$1次修订。删除此类页面的动作已经被限制,以防止在{{SITENAME}}上的意外扰乱。",
- "delete-warning-toobig": "这个页面有一个十分大量的编辑历史,超过$1次修订。删除它可能会扰乱{{SITENAME}}的数据库操作;在继续此动作前请小心。",
+ "delete-toobig": "这个页面有一个十分大量的编辑历史,超过$1个版本。删除此类页面的动作已经被限制,以防止在{{SITENAME}}上的意外扰乱。",
+ "delete-warning-toobig": "这个页面有一个十分大量的编辑历史,超过$1个版本。删除它可能会扰乱{{SITENAME}}的数据库操作;在继续此动作前请小心。",
"deleting-backlinks-warning": "'''警告:'''有[[Special:WhatLinksHere/{{FULLPAGENAME}}|其他页面]]链接至或包含您要删除的页面。",
"rollback": "回退编辑",
"rollback_short": "回退",
"protect-otherreason-op": "其他原因",
"protect-dropdown": "*常见保护原因\n** 过度破坏\n** 过多垃圾信息\n** 负面的编辑战\n** 高流量页面",
"protect-edit-reasonlist": "编辑保护原因",
- "protect-expiry-options": "1小时:1 hour,1天:1 day,1周:1 week,2周:2 weeks,1个月:1 month,3个月:3 months,6个月:6 months,1年:1 year,无限期:infinite",
+ "protect-expiry-options": "1小时:1 hour,1天:1 day,1周:1 week,2周:2 weeks,1个月:1 month,3个月:3 months,6个月:6 months,1年:1 year,不限期:infinite",
"restriction-type": "权限:",
"restriction-level": "限制级别:",
"minimum-size": "最小尺寸",
"restriction-level-all": "任何级别",
"undelete": "查看被删除页面",
"undeletepage": "查看和还原被删除的页面",
- "undeletepagetitle": "'''以下包含[[:$1]]的已删除之修订版本'''。",
+ "undeletepagetitle": "'''以下包含[[:$1]]的已删除之版本'''。",
"viewdeletedpage": "查看被删页面",
"undeletepagetext": "以下{{PLURAL:$1|页面|$1个页面}}已被删除,但依然在归档中并可以被恢复。归档可能会被定时清理。",
"undelete-fieldset-title": "还原版本",
"undeleteextrahelp": "要恢复该页面的整个历史记录时,不选中任何复选框直接点击'''''{{int:undeletebtn}}'''''。要选择性地恢复部分版本时,请选中相应版本前的复选框再点击'''''{{int:undeletebtn}}'''''。",
"undeleterevisions": "$1版本存档",
- "undeletehistory": "如果您恢复了该页面,所有版本都会被恢复到修订历史中。\n如果本页删除后有一个同名的新页面建立,被恢复的版本将会出现在先前的历史中。",
- "undeleterevdel": "如果把最新修订部分删除,反删除将会无法进行。如果遇到这种情况,您必须反选或反隐藏最新已删除的修订。",
- "undeletehistorynoadmin": "这个页面已被删除。删除原因显示在下方编辑摘要中,被删除前的所有修订文本连同删除前贡献用户的细节信息只对管理员可见。",
- "undelete-revision": "$1由$3(在$4 $5)所编写的已删除修订版本:",
- "undeleterevision-missing": "无效或丢失的修订版本。您可能使用了错误的链接,或者此修订版本已经被从存档中恢复或移除。",
- "undelete-nodiff": "找不到先前的修订版本。",
+ "undeletehistory": "如果您恢复了该页面,所有版本都会被恢复到版本历史中。如果本页删除后有一个同名的新页面建立,被恢复的版本将会出现在先前的历史中。",
+ "undeleterevdel": "如果把最新版本部分删除,反删除将会无法进行。如果遇到这种情况,您必须反选或反隐藏最新已删除的版本。",
+ "undeletehistorynoadmin": "这个页面已被删除。删除原因显示在下方编辑摘要中,被删除前的所有版本文本连同删除前贡献用户的细节信息只对管理员可见。",
+ "undelete-revision": "$1由$3(在$4 $5)所编写的已删除版本:",
+ "undeleterevision-missing": "无效或丢失的版本。您可能使用了错误的链接,或者此版本已经被从存档中恢复或移除。",
+ "undelete-nodiff": "找不到先前的版本。",
"undeletebtn": "还原",
"undeletelink": "查看/还原",
"undeleteviewlink": "查看",
"undelete-search-prefix": "显示页面自:",
"undelete-search-submit": "搜索",
"undelete-no-results": "删除日志中没有匹配的结果。",
- "undelete-filename-mismatch": "不能删除带有时间戳的文件修订$1:文件不匹配",
- "undelete-bad-store-key": "不能删除带有时间戳的文件修订$1:文件在删除前遗失。",
+ "undelete-filename-mismatch": "不能删除带有时间戳的文件版本$1:文件不匹配",
+ "undelete-bad-store-key": "不能删除带有时间戳的文件版本$1:文件在删除前遗失。",
"undelete-cleanup-error": "删除无用的存档文件“$1”时发生错误。",
"undelete-missing-filearchive": "由于文件存档 ID $1 不在数据库中,不能在文件存档中恢复。它可能已经被恢复了。",
"undelete-error": "还原页面出错",
"sp-contributions-newbies-sub": "新账户的贡献",
"sp-contributions-newbies-title": "新账户的用户贡献",
"sp-contributions-blocklog": "封禁日志",
- "sp-contributions-suppresslog": "已被删除的用户贡献",
- "sp-contributions-deleted": "已被删除的用户贡献",
+ "sp-contributions-suppresslog": "被压制的用户贡献",
+ "sp-contributions-deleted": "被删除的用户贡献",
"sp-contributions-uploads": "上传",
"sp-contributions-logs": "日志",
"sp-contributions-talk": "讨论",
"ipbenableautoblock": "自动封禁该用户最后使用的IP地址,以及他们随后试图用于编辑的所有IP地址",
"ipbsubmit": "封禁该用户",
"ipbother": "其它时间:",
- "ipboptions": "2小时:2 hours,1天:1 day,3天:3 days,1周:1 week,2周:2 weeks,1个月:1 month,3个月:3 months,6个月:6 months,1年:1 year,无限期:infinite",
+ "ipboptions": "2小时:2 hours,1天:1 day,3天:3 days,1周:1 week,2周:2 weeks,1个月:1 month,3个月:3 months,6个月:6 months,1年:1 year,不限期:infinite",
"ipbhidename": "在编辑及列表中隐藏用户名",
"ipbwatchuser": "监视该用户的用户页和讨论页",
"ipb-disableusertalk": "阻止用户在封禁期间编辑自己的讨论页",
"lockedbyandtime": "(由 {{GENDER:$1|$1}} 于$2 $3执行)",
"move-page": "移动$1",
"move-page-legend": "移动页面",
- "movepagetext": "您可以使用下面的表单来重命名一个页面,同时将其修订历史移动到新页面。\n同时老的条目将会被重定向到新条目。\n您可以自动地将重定向更新到原条目。\n如果您不选择这样做的话,请检查[[Special:DoubleRedirects|双重]]或[[Special:BrokenRedirects|损坏重定向]]链接。\n您有责任确保链接会被正确指向他们应该被指向的地方。\n\n注意:即使新条目已经有对应页面,此页面也'''不会'''被移动,除非新页面无任何编辑历史或是重定向页。\n这意味着您可在误操作后将页面移回原处,同时,您也无法覆盖现有页面。\n\n'''警告!'''\n对这样一个经常被访问的页面而言这可能是一个重大且唐突的更改;\n请在行动前先了解您的修改可能带来的一切后果。",
- "movepagetext-noredirectfixer": "用下面的表单来重命名一个页面,并将其修订历史同时移动到新页面。\n老的页面将成为新页面的重定向页。\n请检查[[Special:DoubleRedirects|双重重定向]]或[[Special:BrokenRedirects|损坏重定向]]链接。\n您应当负责确定所有链接依然会链到指定的页面。\n\n注意如果新页面已经有内容的话,页面将'''不会'''被移动,\n除非新页面无内容或是重定向页,而且没有修订历史。\n这意味着您再必要时可以在移动到新页面后再移回老的页面,\n同时您也无法覆盖现有页面。\n\n'''警告!'''\n对一个经常被访问的页面而言这可能是一个重大与唐突的更改;\n请在行动前先确定您了解其所可能带来的后果。",
+ "movepagetext": "您可以使用下面的表单来重命名一个页面,同时将其版本历史移动到新页面。同时老的条目将会被重定向到新条目。您可以自动地将重定向更新到原条目。如果您不选择这样做的话,请检查[[Special:DoubleRedirects|双重]]或[[Special:BrokenRedirects|损坏重定向]]链接。您有责任确保链接会被正确指向他们应该被指向的地方。\n\n注意:即使新条目已经有对应页面,此页面也'''不会'''被移动,除非新页面无任何编辑历史或是重定向页。这意味着您可在误操作后将页面移回原处,同时,您也无法覆盖现有页面。\n\n'''警告!'''对这样一个经常被访问的页面而言这可能是一个重大且唐突的更改;请在行动前先了解您的修改可能带来的一切后果。",
+ "movepagetext-noredirectfixer": "用下面的表单来重命名一个页面,并将其版本历史同时移动到新页面。\n老的页面将成为新页面的重定向页。\n请检查[[Special:DoubleRedirects|双重重定向]]或[[Special:BrokenRedirects|损坏重定向]]链接。\n您应当负责确定所有链接依然会链到指定的页面。\n\n注意如果新页面已经有内容的话,页面将'''不会'''被移动,\n除非新页面无内容或是重定向页,而且没有版本历史。\n这意味着您再必要时可以在移动到新页面后再移回老的页面,\n同时您也无法覆盖现有页面。\n\n'''警告!'''\n对一个经常被访问的页面而言这可能是一个重大与唐突的更改;\n请在行动前先确定您了解其所可能带来的后果。",
"movepagetalktext": "有关的讨论页将被自动与该页面一起移动,'''除非''':\n*新页面已经有一个包含内容的讨论页,或者\n*您不勾选下面的复选框。\n\n在这些情况下,您在必要时必须手工移动或合并页面。",
"movearticle": "移动页面:",
"moveuserpage-warning": "'''警告:'''你将移动一个用户页面。请注意,只有该页面会被移动,该用户''不''会被更名。",
"move-over-sharedrepo": "== 文件已存在 ==\n[[:$1]]已于共享资源存在,将文件移动到此标题会覆盖共享资源中的文件。",
"file-exists-sharedrepo": "同名文件已于共享资源存在。\n请选择另一个文件名。",
"export": "导出页面",
- "exporttext": "您可以将特定页面或一组页面的文本以及编辑历史以 XML 格式导出;这样可以将有关页面通过“[[Special:Import|导入页面]]”导入到另一个运行 MediaWiki 的网站。\n\n要导出页面,请在下面的文本框中输入页面标题,每行一个标题,并选择您是否需要导出带有页面历史的以前的修订版本,或是只选择导出带有最后一次编辑信息的当前修订版本。\n\n此外您还可以利用链接导出文件,例如您可以使用[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]导出“[[{{MediaWiki:Mainpage}}]]”页面。",
+ "exporttext": "您可以将特定页面或一组页面的文本以及编辑历史以 XML 格式导出;这样可以将有关页面通过“[[Special:Import|导入页面]]”导入到另一个运行 MediaWiki 的网站。\n\n要导出页面,请在下面的文本框中输入页面标题,每行一个标题,并选择您是否需要导出带有页面历史的以前的版本,或是只选择导出带有最后一次编辑信息的当前版本。\n\n此外您还可以利用链接导出文件,例如您可以使用[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]导出“[[{{MediaWiki:Mainpage}}]]”页面。",
"exportall": "导出所有页面",
"exportcuronly": "仅包含当前版本,而不是完整历史。",
"exportnohistory": "----\n'''注意:'''由于性能原因,从此表单导出页面的全部历史已被禁用。",
"export-addnstext": "从名字空间添加页面:",
"export-addns": "添加",
"export-download": "另存为文件",
- "export-templates": "包括模板",
+ "export-templates": "包含模板",
"export-pagelinks": "包含链接页面的搜索深度:",
"allmessages": "系统消息",
"allmessagesname": "名称",
"thumbnail_image-failure-limit": "近期尝试生成此缩略图失败太多次($1次或更多)。请稍后再试。",
"import": "导入页面",
"importinterwiki": "跨wiki导入",
- "import-interwiki-text": "选择要导入的wiki和页面标题,导入修订的日期和编辑者名称会被保存。所有的跨wiki导入操作都将记录到[[Special:Log/import|导入日志]]。",
+ "import-interwiki-text": "选择要导入的wiki和页面标题,导入版本的日期和编辑者名称会被保存。所有的跨wiki导入操作都将记录到[[Special:Log/import|导入日志]]。",
"import-interwiki-source": "来源wiki/页面:",
- "import-interwiki-history": "复制此页的所有历史修订版本",
+ "import-interwiki-history": "复制此页的所有历史版本",
"import-interwiki-templates": "包含所有模板",
"import-interwiki-submit": "导入",
"import-interwiki-namespace": "目标名字空间:",
"importuploaderrortemp": "上传导入文件失败。临时文件夹已遗失。",
"import-parse-failure": "XML导入语法失败",
"import-noarticle": "没有页面作导入!",
- "import-nonewrevisions": "没有导入修订(所有都已存在或因错误跳过)。",
+ "import-nonewrevisions": "没有导入版本(所有都已存在或因错误跳过)。",
"xml-error-string": "$1于行$2,列$3($4字节):$5",
"import-upload": "上传XML数据",
"import-token-mismatch": "会话数据遗失。请重试。",
"import-error-special": "页面“$1”未导入,因为它需要使用一个不能创建页面的特殊名字空间。",
"import-error-invalid": "页面“$1”未能导入,因为它的名字无效。",
"import-error-unserialize": "页面“$1”的版本$2无法反序列化。此版本使用内容模型$3序列化为$4。",
- "import-error-bad-location": "在此wiki使用了内容模式$3的修订版本$2不能被保存至“$1”,这是因为此模式在此页面不被支持。",
+ "import-error-bad-location": "在此wiki使用了内容模式$3的版本$2不能被保存至“$1”,这是因为此模式在此页面不被支持。",
"import-options-wrong": "{{PLURAL:$2|选项}}出错:<nowiki>$1</nowiki>",
"import-rootpage-invalid": "根页面的标题无效。",
"import-rootpage-nosubpage": "名字空间为“$1”的根页面不允许子页面。",
"tooltip-t-upload": "上传文件",
"tooltip-t-specialpages": "所有特殊页面的列表",
"tooltip-t-print": "本页面的可打印版本",
- "tooltip-t-permalink": "本页面该版本的永久链接",
+ "tooltip-t-permalink": "本页面该版本的固定链接",
"tooltip-ca-nstab-main": "查看内容页面",
"tooltip-ca-nstab-user": "查看用户页面",
"tooltip-ca-nstab-media": "查看媒体文件页面",
"tooltip-preferences-save": "保存系统设置",
"tooltip-summary": "请输入简短的摘要",
"interlanguage-link-title": "$1 – $2",
+ "interlanguage-link-title-nonlang": "$1——$2",
"common.css": "/* 放置于这里的CSS将应用于所有皮肤 */",
- "monobook.css": "/* 放置于这里的CSS将影响使用MonoBook皮肤的用户 */",
- "vector.css": "/* 放置于这里的CSS将影响使用Vector皮肤的用户 */",
"print.css": "/* 放置于这里的CSS将影响打印输出 */",
"noscript.css": "/* 放置于这里的CSS将影响停用JavaScript的用户 */",
"group-autoconfirmed.css": "/* 放置于这里的CSS将只影响自动确认用户 */",
"group-sysop.css": "/* 放置于这里的CSS将只影响管理员 */",
"group-bureaucrat.css": "/* 放置于这里的CSS将只影响机行政员 */",
"common.js": "/* 这里的任何JavaScript将为所有用户在每次页面载入时加载。 */",
- "monobook.js": "/* 这里的任何JavaScript将为使用MonoBook皮肤的用户加载 */",
- "vector.js": "/* 这里的任何JavaScript将为使用Vector皮肤的用户加载 */",
"group-autoconfirmed.js": "/* 这里的任何JavaScript将只为自动确认用户加载 */",
"group-bot.js": "/* 这里的任何JavaScript将只为机器人加载 */",
"group-sysop.js": "/* 这里的任何JavaScript将只为管理员加载 */",
"spamprotectionmatch": "以下文本触发了我们的垃圾链接过滤器:$1",
"spambot_username": "MediaWiki垃圾链接清理器",
"spam_reverting": "恢复至不包含$1的链接的最后版本",
- "spam_blanking": "消隐所有包含链接至$1的修订",
+ "spam_blanking": "消隐所有包含链接至$1的版本",
"spam_deleting": "正在删除所有包含至$1的版本",
"simpleantispam-label": "反垃圾检查。\n'''不要'''加入这个!",
"pageinfo-title": "“$1”的信息",
"markaspatrolleddiff": "标记为已巡查",
"markaspatrolledtext": "标记此页面为已巡查",
"markedaspatrolled": "标记为已检查",
- "markedaspatrolledtext": "[[:$1]]的已选中修订版本已被标识为已巡查。",
+ "markedaspatrolledtext": "[[:$1]]的已选中版本已被标识为已巡查。",
"rcpatroldisabled": "最新更改检查被关闭",
"rcpatroldisabledtext": "最近更改巡查功能目前已关闭。",
"markedaspatrollederror": "不能标志为已检查",
"filedeleteerror-short": "删除文件发生错误:$1",
"filedeleteerror-long": "删除文件时出错:\n\n$1",
"filedelete-missing": "文件“$1”不存在而无法删除。",
- "filedelete-old-unregistered": "所指定的文件修订“$1”在数据库中不存在。",
+ "filedelete-old-unregistered": "所指定的文件版本“$1”在数据库中不存在。",
"filedelete-current-unregistered": "所指定的文件“$1”在数据库中不存在。",
"filedelete-archive-read-only": "存档目录“$1”在网页服务器中不可写。",
"previousdiff": "←上一编辑",
"confirm-watch-top": "将此页添加到您的监视吗?",
"confirm-unwatch-button": "确定",
"confirm-unwatch-top": "从监视列表中删除此页吗?",
+ "semicolon-separator": ";",
"comma-separator": "、",
"colon-separator": ":",
"pipe-separator": " | ",
"version-hook-name": "钩名",
"version-hook-subscribedby": "署名",
"version-version": "(版本 $1)",
+ "version-no-ext-name": "[无名称]",
"version-license": "MediaWiki协议",
"version-ext-license": "许可协议",
"version-ext-colheader-name": "扩展程序",
"乌拉跨氪",
"아라",
"Vincent Liu",
- "Mywood"
+ "Mywood",
+ "Cwek"
]
},
"tog-underline": "連結底線:",
"qbmyoptions": "我的頁面",
"faq": "常見問答",
"faqpage": "Project:FAQ",
- "vector-action-addsection": "加入主題",
- "vector-action-delete": "刪除",
- "vector-action-move": "移動",
- "vector-action-protect": "保護",
- "vector-action-undelete": "取消刪除",
- "vector-action-unprotect": "變更保護",
- "vector-view-create": "建立",
- "vector-view-edit": "編輯",
- "vector-view-history": "檢視歷史",
- "vector-view-view": "閱讀",
- "vector-view-viewsource": "檢視原始碼",
"actions": "動作",
- "vector-more-actions": "更多",
"namespaces": "命名空間",
"variants": "變體",
"navigation-heading": "導覽選單",
"history_short": "歷史",
"updatedmarker": "自我最後一次訪問以後的更新",
"printableversion": "可列印版",
- "permalink": "永久連結",
+ "permalink": "固定連結",
"print": "列印",
"view": "檢視",
"view-foreign": "用 $1 檢視",
"previousrevision": "←上個修訂",
"nextrevision": "下個修訂→",
"currentrevisionlink": "最新修訂",
- "cur": "ç\8f¾",
+ "cur": "ç\9b®å\89\8d",
"next": "後筆",
- "last": "前",
+ "last": "前筆",
"page_first": "第一頁",
"page_last": "最後頁",
"histlegend": "比較選擇的版本差異:選要比較修訂版本的單選方塊並點選網頁底部的按鈕進行比較。<br />\n符號說明:<strong>({{int:cur}})</strong> = 與最新的修訂版本比較,<strong>({{int:last}})</strong> = 與前一筆修訂版本比較,<strong>{{int:minoreditletter}}</strong> = 小修訂。",
"difference-missing-revision": "{{PLURAL:$2|1次修訂|$2 次修訂}}差異($1)不存在。\n\n這通常是因為過時的頁面修訂差異鏈接被刪除。\n詳情請閱[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。",
"searchresults": "搜尋結果",
"searchresults-title": "\"$1\" 的搜尋結果",
- "toomanymatches": "太多符合條件的結果,請嘗試使用較複雜的查詢",
"titlematches": "頁面標題符合",
"textmatches": "頁面內容符合",
"notextmatches": "沒有符合的頁面內容",
"largefileserver": "此檔案大小超出伺服器設定的允許範圍。",
"emptyfile": "您上傳的檔案為空的。\n可能是檔案名輸入錯誤。\n請檢查您是否真的要上傳空檔案。",
"windows-nonascii-filename": "本 Wiki 不支援使用特殊符號的檔案名稱。",
- "fileexists": "已存在相同名稱的檔案,若您不確定是否要變更它,請檢查 <strong>[[:$1]]</strong>。\n[[$1|thumb]]",
+ "fileexists": "已存在相同名稱的檔案,若{{GENDER:|您}}不確定是否要變更它,請檢查 <strong>[[:$1]]</strong>。\n[[$1|thumb]]",
"filepageexists": "此檔案的描述頁面 <strong>[[:$1]]</strong> 已存在,但目前沒有使用此名稱的檔案。\n您在此輸入的摘要不會儲存到該描述頁面,\n您必須手動編輯該描述頁面。\n[[$1|thumb]]",
"fileexists-extension": "類似的檔案名稱已存在:[[$2|thumb]]\n* 上傳中的檔案名稱:<strong>[[:$1]]</strong>\n* 已存在的檔案名稱:<strong>[[:$2]]</strong>\n請選擇使用其他名稱。",
"fileexists-thumbnail-yes": "此檔案似乎已為縮小的圖片 <em>(縮圖)</em>。\n[[$1|thumb]]\n請檢查檔案 <strong>[[:$1]]</strong>。\n若原始圖片確實為此尺寸,則無須另外上傳縮圖。",
"tooltip-t-upload": "上傳檔案",
"tooltip-t-specialpages": "全部特殊頁面的列表",
"tooltip-t-print": "此頁面的可列印版本",
- "tooltip-t-permalink": "此頁面修訂的永久連結",
+ "tooltip-t-permalink": "此頁面修訂的固定連結",
"tooltip-ca-nstab-main": "檢視頁面內容",
"tooltip-ca-nstab-user": "檢視使用者頁面",
"tooltip-ca-nstab-media": "檢視媒體頁面",
"tooltip-summary": "請輸入簡短摘要",
"interlanguage-link-title": "$1 – $2",
"common.css": "/* 此 CSS 會套用至所有的介面外觀 */",
- "monobook.css": "/* 此 CSS 會影響使用 Monobook 介面外觀的使用者 */",
- "vector.css": "/* 此 CSS 會影響使用 Vector 介面外觀的使用者 */",
"print.css": "/* 此 CSS 會影響列印版輸出 */",
"noscript.css": "/* 此 CSS 會影響沒有啓用 JavaScript 的使用者 */",
"group-autoconfirmed.css": "/* 此 CSS 會影響自動確認的使用者 */",
"group-sysop.css": "/* 此 CSS 會影響管理員 */",
"group-bureaucrat.css": "/* 此 CSS 會影響行政員 */",
"common.js": "/* 此 JavaScript 會用於使用者載入的每一個頁面。 */",
- "monobook.js": "/* 此 JavaScript 會用於使用 Monobook 介面外觀使用者 */",
- "vector.js": "/* 此 JavaScript 會用於使用 Vector 介面外觀使用者 */",
"anonymous": "{{SITENAME}} 的匿名{{PLURAL:$1|使用者}}",
"siteuser": "{{SITENAME}} 使用者 $1",
"anonuser": "{{SITENAME}} 匿名使用者 $1",
"confirm-watch-top": "新增此頁面至您的監視清單?",
"confirm-unwatch-button": "確定",
"confirm-unwatch-top": "從您的監視清單中移除此頁面?",
+ "semicolon-separator": ";",
"comma-separator": "、",
"colon-separator": ":",
"word-separator": "",
$namespaceAliases = array(
'Gesprec' => NS_TALK,
+ 'Motung' => NS_TALK,
'Brucend' => NS_USER,
'Brucendmotung' => NS_USER_TALK,
'Biliþgesprec' => NS_FILE_TALK,
+ 'Biliþmotung' => NS_FILE_TALK,
'Bysengesprec' => NS_TEMPLATE_TALK,
+ 'Bysenmotung' => NS_TEMPLATE_TALK,
'Helpgesprec' => NS_HELP_TALK,
+ 'Helpmotung' => NS_HELP_TALK,
'Floccgesprec' => NS_CATEGORY_TALK,
+ 'Floccmotung' => NS_CATEGORY_TALK,
);
'ISO 8601 time' => 'xnH:xni:xns',
'ISO 8601 date' => 'xnY-xnm-xnd',
'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+
+ 'jMY time' => 'H:i',
+ 'jMY date' => 'j M Y',
+ 'jMY both' => 'H:i، j M Y', # Arabic comma
);
$digitTransformTable = array(
us_status varchar(50) not null,
- -- file properties from File::getPropsFromPath. these may prove unnecessary.
+ -- file properties from FSFile::getProps(). these may prove unnecessary.
--
us_size int unsigned NOT NULL,
- -- this hash comes from File::sha1Base36(), and is 31 characters
+ -- this hash comes from FSFile::getSha1Base36(), and is 31 characters
us_sha1 varchar(31) NOT NULL,
us_mime varchar(255),
-- Media type as defined by the MEDIATYPE_xxx constants, should duplicate definition in the image table
$documented = $this->getHooksFromDoc( $IP . '/docs/hooks.txt' );
$potential = array();
$bad = array();
+
+ // TODO: Don't hardcode the list of directories
$pathinc = array(
$IP . '/',
$IP . '/includes/',
$IP . '/includes/specialpage/',
$IP . '/includes/specials/',
$IP . '/includes/upload/',
+ $IP . '/includes/utils/',
$IP . '/languages/',
$IP . '/maintenance/',
$IP . '/maintenance/language/',
$IP . '/tests/parser/',
$IP . '/tests/phpunit/suites/',
$IP . '/skins/',
+ $IP . '/skins/MonoBook/',
+ $IP . '/skins/Vector/',
);
foreach ( $pathinc as $dir ) {
-- chunk counter starts at 0, current offset is stored in us_size
us_chunk_inx int NULL,
- -- Serialized file properties from File::getPropsFromPath
+ -- Serialized file properties from FSFile::getProps()
us_props nvarchar(max),
-- file size in bytes
us_size int NOT NULL,
- -- this hash comes from File::sha1Base36(), and is 31 characters
+ -- this hash comes from FSFile::getSha1Base36(), and is 31 characters
us_sha1 nvarchar(31) NOT NULL,
us_mime nvarchar(255),
-- Media type as defined by the MEDIATYPE_xxx constants, should duplicate definition in the image table
-- chunk counter starts at 0, current offset is stored in us_size
us_chunk_inx int unsigned NULL,
- -- Serialized file properties from File::getPropsFromPath
+ -- Serialized file properties from FSFile::getProps()
us_props blob,
-- file size in bytes
us_size int unsigned NOT NULL,
- -- this hash comes from File::sha1Base36(), and is 31 characters
+ -- this hash comes from FSFile::getSha1Base36(), and is 31 characters
us_sha1 varchar(31) NOT NULL,
us_mime varchar(255),
-- Media type as defined by the MEDIATYPE_xxx constants, should duplicate definition in the image table
'targets' => array( 'desktop', 'mobile' ),
),
- /**
- * Skins
- * Be careful not to add 'scripts' to these modules,
- * since they are loaded with OutputPage::addModuleStyles so that the skin styles
- * apply without javascript.
- * If a skin needs custom js in the interface, register a separate module
- * and add it to the load queue with OutputPage::addModules.
- *
- * See Vector for an example.
- */
- 'skins.vector.styles' => array(
- // Used in the web installer. Test it after modifying this definition!
- 'styles' => array(
- 'screen.less' => array( 'media' => 'screen' ),
- 'screen-hd.less' => array( 'media' => 'screen and (min-width: 982px)' ),
- ),
- 'remoteSkinPath' => 'vector',
- 'localBasePath' => $GLOBALS['wgStyleDirectory'] . '/vector',
- ),
- 'skins.monobook.styles' => array(
- 'styles' => array(
- 'main.css' => array( 'media' => 'screen' ),
- ),
- 'remoteSkinPath' => 'monobook',
- 'localBasePath' => $GLOBALS['wgStyleDirectory'] . '/monobook',
- ),
- 'skins.vector.js' => array(
- 'scripts' => array(
- 'collapsibleTabs.js',
- 'vector.js',
- ),
- 'position' => 'top',
- 'dependencies' => array(
- 'jquery.throttle-debounce',
- 'jquery.tabIndex',
- ),
- 'remoteSkinPath' => 'vector',
- 'localBasePath' => $GLOBALS['wgStyleDirectory'] . '/vector',
- ),
-
/* jQuery */
'jquery' => array(
'scripts' => 'resources/src/mediawiki.special/mediawiki.special.js',
'styles' => 'resources/src/mediawiki.special/mediawiki.special.css',
'skinStyles' => array(
- 'vector' => 'skins/vector/special.less', // FIXME this should use $wgStyleDirectory
+ 'vector' => 'skins/Vector/special.less', // FIXME this should use $wgStyleDirectory
),
),
'mediawiki.special.block' => array(
'styles' => 'resources/src/mediawiki.special/mediawiki.special.preferences.css',
'position' => 'top',
'skinStyles' => array(
- 'vector' => 'skins/vector/special.preferences.less', // FIXME this should use $wgStyleDirectory
+ 'vector' => 'skins/Vector/special.preferences.less', // FIXME this should use $wgStyleDirectory
),
'messages' => array(
'prefs-tabs-navigation-hint',
"ooui-outline-control-move-down": "Лаха яккха элемент",
"ooui-outline-control-move-up": "Лаккха яккха элемент",
"ooui-outline-control-remove": "ДӀадаха меттиг",
- "ooui-toolbar-more": "Кхин тӀе",
+ "ooui-toolbar-more": "Кхин",
"ooui-dialog-confirm-title": "Бакъдан",
"ooui-dialog-confirm-default-prompt": "Бакъалла лаьий хӀуна?",
"ooui-dialog-confirm-default-ok": "ХӀаъ",
]
},
"ooui-dialog-action-close": "ಮುಚ್ಚಿ",
+ "ooui-outline-control-move-down": "ವಸ್ತು ಕೆಲ್ಗೆ ಸ್ಥಲಾನ್ಥರಿಸು",
+ "ooui-outline-control-move-up": "ವಸ್ತು ಮೆಲೆ ಸ್ಥಲಾನ್ಥರಿಸು",
"ooui-outline-control-remove": "ವಸ್ತು ತೆಗೆ",
"ooui-toolbar-more": "ಹೆಚ್ಚು",
"ooui-dialog-confirm-title": "ಧೃಡಪಡಿಸು",
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12" height="12" viewBox="0, 0, 12, 12">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
+ height="12px" viewBox="0 0 12 12">
<g id="deprecated" opacity="0.75">
- <path d="M6,12 C2.686,12 -0,9.314 -0,6 C-0,2.686 2.686,-0 6,-0 C9.314,-0 12,2.686 12,6 C12,9.314 9.314,12 6,12 z M5,7 L7,7 L7,2 L5,2 z M5,10 L7,10 L7,8 L5,8 z" fill="#000000"/>
+ <path d="M6,12 C2.686,12 -0,9.314 -0,6 C-0,2.686 2.686,-0 6,-0 C9.314,-0 12,2.686 12,6 C12,9.314 9.314,12 6,12 z M5,7 L7,7 L7,2 L5,2 z M5,10 L7,10 L7,8 L5,8 z"/>
</g>
<defs/>
</svg>
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
- height="12px" viewBox="0 0 12 12" style="enable-background:new 0 0 12 12;" xml:space="preserve">
+ height="12px" viewBox="0 0 12 12">
<g id="down" style="opacity:0.75;">
- <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="2.023,3 5.512,8.953 9,3"/>
+ <polygon id="arrow" points="2,3 5.5,9 9,3"/>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
- height="12px" viewBox="0 0 12 12" style="enable-background:new 0 0 12 12;" xml:space="preserve">
+ height="12px" viewBox="0 0 12 12">
<g id="ltr" opacity="0.75">
- <path d="M3.023,8.977 L3.023,2 L8.976,5.489 z" fill="#000000" id="arrow"/>
+ <path id="arrow" d="M3,9 L3,2 L9,5.5 z"/>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
- height="12px" viewBox="0 0 12 12" style="enable-background:new 0 0 12 12;" xml:space="preserve">
+ height="12px" viewBox="0 0 12 12">
<g id="rtl" opacity="0.75">
- <path d="M3.023,5.489 L8.976,8.977 L8.976,2 z" fill="#000000" id="arrow"/>
+ <path id="arrow" d="M3,5.5 L9,9 L9,2 z"/>
</g>
</svg>
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
- height="12px" viewBox="0 0 12 12" style="enable-background:new 0 0 12 12;" xml:space="preserve">
+ height="12px" viewBox="0 0 12 12">
<g id="up" style="opacity:0.75;">
- <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="5.512,2.006 2,8 9.024,8 "/>
+ <polygon id="arrow" points="5.5,2 2,8 9,8"/>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12" height="12" viewBox="0, 0, 12, 12">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
+ height="12px" viewBox="0 0 12 12">
<g id="required" opacity="0.75">
- <path d="M5,1 L7,1 L7,11 L5,11 z" fill="#000000"/>
- <path d="M9.83,2.634 L10.83,4.366 L2.17,9.366 L1.17,7.634 z" fill="#000000"/>
- <path d="M1.17,4.366 L2.17,2.634 L10.83,7.634 L9.83,9.366 z" fill="#000000"/>
+ <path d="M5,1 L7,1 L7,11 L5,11 z"/>
+ <path d="M9.83,2.634 L10.83,4.366 L2.17,9.366 L1.17,7.634 z"/>
+ <path d="M1.17,4.366 L2.17,2.634 L10.83,7.634 L9.83,9.366 z"/>
</g>
<defs/>
</svg>
/*!
- * OOjs UI v0.1.0-pre (c5ae888f67)
+ * OOjs UI v0.1.0-pre (7a0e222a75)
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2014 OOjs Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: Wed Jun 11 2014 18:10:09 GMT-0700 (PDT)
+ * Date: Wed Jun 18 2014 16:19:15 GMT-0700 (PDT)
*/
( function ( OO ) {
// Configuration initialization
config = config || {};
- var anim = {},
+ var rel, anim = {},
callback = typeof config.complete === 'function' && config.complete,
sc = this.getClosestScrollableContainer( el, config.direction ),
$sc = $( sc ),
eld = this.getDimensions( el ),
scd = this.getDimensions( sc ),
+ $win = $( this.getWindow( el ) );
+
+ // Compute the distances between the edges of el and the edges of the scroll viewport
+ if ( $sc.is( 'body' ) ) {
+ // If the scrollable container is the <body> this is easy
+ rel = {
+ 'top': eld.rect.top,
+ 'bottom': $win.innerHeight() - eld.rect.bottom,
+ 'left': eld.rect.left,
+ 'right': $win.innerWidth() - eld.rect.right
+ };
+ } else {
+ // Otherwise, we have to subtract el's coordinates from sc's coordinates
rel = {
'top': eld.rect.top - ( scd.rect.top + scd.borders.top ),
'bottom': scd.rect.bottom - scd.borders.bottom - scd.scrollbar.bottom - eld.rect.bottom,
'left': eld.rect.left - ( scd.rect.left + scd.borders.left ),
'right': scd.rect.right - scd.borders.right - scd.scrollbar.right - eld.rect.right
};
+ }
if ( !config.direction || config.direction === 'y' ) {
if ( rel.top < 0 ) {
/**
* Bind a handler for an event on this.$element
*
+ * @deprecated Use jQuery#on instead.
* @param {string} event
* @param {Function} callback
*/
/**
* Unbind a handler bound with #offDOMEvent
*
+ * @deprecated Use jQuery#off instead.
* @param {string} event
* @param {Function} callback
*/
};
( function () {
- // Static
-
- // jQuery 1.8.3 has a bug with handling focusin/focusout events inside iframes.
- // Firefox doesn't support focusin/focusout at all, so we listen for 'focus'/'blur' on the
- // document, and simulate a 'focusin'/'focusout' event on the target element and make
- // it bubble from there.
- //
- // - http://jsfiddle.net/sw3hr/
- // - http://bugs.jquery.com/ticket/14180
- // - https://github.com/jquery/jquery/commit/1cecf64e5aa4153
- function specialEvent( simulatedName, realName ) {
- function handler( e ) {
- jQuery.event.simulate(
- simulatedName,
- e.target,
- jQuery.event.fix( e ),
- /* bubble = */ true
- );
- }
-
- return {
- setup: function () {
- var doc = this.ownerDocument || this,
- attaches = $.data( doc, 'ooui-' + simulatedName + '-attaches' );
- if ( !attaches ) {
- doc.addEventListener( realName, handler, true );
- }
- $.data( doc, 'ooui-' + simulatedName + '-attaches', ( attaches || 0 ) + 1 );
- },
- teardown: function () {
- var doc = this.ownerDocument || this,
- attaches = $.data( doc, 'ooui-' + simulatedName + '-attaches' ) - 1;
- if ( !attaches ) {
- doc.removeEventListener( realName, handler, true );
- $.removeData( doc, 'ooui-' + simulatedName + '-attaches' );
- } else {
- $.data( doc, 'ooui-' + simulatedName + '-attaches', attaches );
- }
- }
- };
- }
-
- var hasOwn = Object.prototype.hasOwnProperty,
- specialEvents = {
- focusin: specialEvent( 'focusin', 'focus' ),
- focusout: specialEvent( 'focusout', 'blur' )
- };
-
/**
* Bind a handler for an event on a DOM element.
*
- * Uses jQuery internally for everything except for events which are
- * known to have issues in the browser or in jQuery. This method
- * should become obsolete eventually.
+ * Used to be for working around a jQuery bug (jqbug.com/14180),
+ * but obsolete as of jQuery 1.11.0.
*
* @static
+ * @deprecated Use jQuery#on instead.
* @param {HTMLElement|jQuery} el DOM element
* @param {string} event Event to bind
* @param {Function} callback Callback to call when the event fires
*/
OO.ui.Element.onDOMEvent = function ( el, event, callback ) {
- var orig;
-
- if ( hasOwn.call( specialEvents, event ) ) {
- // Replace jQuery's override with our own
- orig = $.event.special[event];
- $.event.special[event] = specialEvents[event];
-
- $( el ).on( event, callback );
-
- // Restore
- $.event.special[event] = orig;
- } else {
- $( el ).on( event, callback );
- }
+ $( el ).on( event, callback );
};
/**
* Unbind a handler bound with #static-method-onDOMEvent.
*
+ * @deprecated Use jQuery#off instead.
* @static
* @param {HTMLElement|jQuery} el DOM element
* @param {string} event Event to unbind
* @param {Function} [callback] Callback to unbind
*/
OO.ui.Element.offDOMEvent = function ( el, event, callback ) {
- var orig;
- if ( hasOwn.call( specialEvents, event ) ) {
- // Replace jQuery's override with our own
- orig = $.event.special[event];
- $.event.special[event] = specialEvents[event];
-
- $( el ).off( event, callback );
-
- // Restore
- $.event.special[event] = orig;
- } else {
- $( el ).off( event, callback );
- }
+ $( el ).off( event, callback );
};
}() );
/**
// Open the window
this.opening = $.Deferred();
+
+ // So we can restore focus on closing
+ this.$prevFocus = $( document.activeElement );
+
this.frame.load().done( OO.ui.bind( function () {
this.$element.show();
this.visible = true;
this.opened.resolve();
}
this.$element.hide();
+ // Restore focus to whatever was focused before opening
+ if ( this.$prevFocus ) {
+ this.$prevFocus.focus();
+ this.$prevFocus = undefined;
+ }
this.visible = false;
this.closing.resolve();
// Now that we are totally done closing, it's safe to allow opening
this.$element.on( 'mousedown', false );
// Initialization
- this.$element.addClass( 'oo-ui-dialog' );
+ this.$element.addClass( 'oo-ui-dialog' ).attr( 'role', 'dialog' );
this.setSize( config.size );
};
/*!
- * OOjs UI v0.1.0-pre (c5ae888f67)
+ * OOjs UI v0.1.0-pre (7a0e222a75)
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2014 OOjs Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: Wed Jun 11 2014 18:10:09 GMT-0700 (PDT)
+ * Date: Wed Jun 18 2014 16:19:15 GMT-0700 (PDT)
*/
/* Textures */
}
return keys;
},
- extend: function () {
- var options, name, src, copy,
- target = arguments[0] || {},
- i = 1,
- length = arguments.length;
-
- for ( ; i < length; i++ ) {
- options = arguments[ i ];
- // Only deal with non-null/undefined values
- if ( options !== null && options !== undefined ) {
- // Extend the base object
- for ( name in options ) {
- src = target[ name ];
- copy = options[ name ];
-
- // Prevent never-ending loop
- if ( target === copy ) {
- continue;
- }
-
- if ( copy !== undefined ) {
- target[ name ] = copy;
- }
- }
- }
- }
-
- // Return the modified object
- return target;
- },
each: function ( object, callback ) {
var name;
for ( name in object ) {
* @param action {Number} What is this function supposed to do (ACTION_INJECT or ACTION_CHECK)
*/
walkTheObject: function ( currName, currVar, masterVariable, parentPathArray, action ) {
-
- var key, value, tmpPathArray,
+ var key, value, currPathArray,
type = util.type( currVar ),
that = this;
+ currPathArray = parentPathArray;
+ if ( currName ) {
+ currPathArray.push( currName );
+ }
+
// Hard ignores
- if ( this.ignoreFn( currVar, that, parentPathArray ) ) {
+ if ( this.ignoreFn( currVar, that, currPathArray ) ) {
return null;
}
// Handle the lazy limit
this.lazyCounter++;
if ( this.lazyCounter > this.lazyLimit ) {
- log( 'CompletenessTest.fn.walkTheObject> Limit reached: ' + this.lazyCounter, parentPathArray );
+ log( 'CompletenessTest.fn.walkTheObject> Limit reached: ' + this.lazyCounter, currPathArray );
return null;
}
if ( action === CompletenessTest.ACTION_INJECT ) {
- that.injectionTracker[ parentPathArray.join( '.' ) ] = true;
- that.injectCheck( masterVariable, parentPathArray, function () {
- that.methodCallTracker[ parentPathArray.join( '.' ) ] = true;
+ that.injectionTracker[ currPathArray.join( '.' ) ] = true;
+ that.injectCheck( masterVariable, currPathArray, function () {
+ that.methodCallTracker[ currPathArray.join( '.' ) ] = true;
} );
}
continue;
}
- // Clone and break reference to parentPathArray
- tmpPathArray = util.extend( [], parentPathArray );
- tmpPathArray.push( 'prototype' );
- tmpPathArray.push( key );
-
- that.walkTheObject( key, value, masterVariable, tmpPathArray, action );
+ that.walkTheObject( key, value, masterVariable, currPathArray.concat( 'prototype' ), action );
}
}
if ( hasOwn.call( currVar, key ) ) {
value = currVar[key];
- // Clone and break reference to parentPathArray
- tmpPathArray = util.extend( [], parentPathArray );
- tmpPathArray.push( key );
-
- that.walkTheObject( key, value, masterVariable, tmpPathArray, action );
+ that.walkTheObject( key, value, masterVariable, currPathArray.slice(), action );
}
}
}
* Type: Number, Range: 1 - 100, Default: 7
* delay: Number of ms to wait for the user to stop typing
* Type: Number, Range: 0 - 1200, Default: 120
+ * cache: Whether to cache results from a fetch
+ * Type: Boolean, Default: false
+ * cacheMaxAge: Number of ms to cache results from a fetch
+ * Type: Number, Range: 1 - Infinity, Default: 60000 (1 minute)
* submitOnClick: Whether to submit the form containing the textbox when a suggestion is clicked
* Type: Boolean, Default: false
* maxExpandFactor: Maximum suggestions box width relative to the textbox width. If set
*/
( function ( $ ) {
+var hasOwn = Object.hasOwnProperty;
+
$.suggestions = {
/**
* Cancel any delayed maybeFetch() call and callback the context so
*/
update: function ( context, delayed ) {
function maybeFetch() {
+ var val = context.data.$textbox.val(),
+ cache = context.data.cache,
+ cacheHit;
+
// Only fetch if the value in the textbox changed and is not empty, or if the results were hidden
// if the textbox is empty then clear the result div, but leave other settings intouched
- if ( context.data.$textbox.val().length === 0 ) {
+ if ( val.length === 0 ) {
$.suggestions.hide( context );
context.data.prevText = '';
} else if (
- context.data.$textbox.val() !== context.data.prevText ||
+ val !== context.data.prevText ||
!context.data.$container.is( ':visible' )
) {
- if ( typeof context.config.fetch === 'function' ) {
- context.data.prevText = context.data.$textbox.val();
- context.config.fetch.call( context.data.$textbox, context.data.$textbox.val() );
+ context.data.prevText = val;
+ // Try cache first
+ if ( context.config.cache && hasOwn.call( cache, val ) ) {
+ if ( +new Date() - cache[ val ].timestamp < context.config.cacheMaxAge ) {
+ context.data.$textbox.suggestions( 'suggestions', cache[ val ].suggestions );
+ cacheHit = true;
+ } else {
+ // Cache expired
+ delete cache[ val ];
+ }
+ }
+ if ( !cacheHit && typeof context.config.fetch === 'function' ) {
+ context.config.fetch.call(
+ context.data.$textbox,
+ val,
+ function ( suggestions ) {
+ context.data.$textbox.suggestions( 'suggestions', suggestions );
+ if ( context.config.cache ) {
+ cache[ val ] = {
+ suggestions: suggestions,
+ timestamp: +new Date()
+ };
+ }
+ }
+ );
}
}
case 'delay':
context.config[property] = Math.max( 0, Math.min( 1200, value ) );
break;
+ case 'cacheMaxAge':
+ context.config[property] = Math.max( 1, value );
+ break;
case 'maxExpandFactor':
context.config[property] = Math.max( 1, value );
break;
+ case 'cache':
case 'submitOnClick':
case 'positionFromLeft':
case 'highlightInput':
- context.config[property] = value ? true : false;
+ context.config[property] = !!value;
break;
}
},
suggestions: [],
maxRows: 7,
delay: 120,
+ cache: false,
+ cacheMaxAge: 60000,
submitOnClick: false,
maxExpandFactor: 3,
expandFrom: 'auto',
// Text in textbox when suggestions were last fetched
prevText: null,
+ // Cache of fetched suggestions
+ cache: {},
+
// Number of results visible without scrolling
visibleResults: 0,
/*!
- * Change multi-page image navigation so that the current page display can be changed
- * without a page reload. Currently, the only image formats that can be multi-page images are
- * PDF and DjVu files
+ * Implement AJAX navigation for multi-page images so the user may browse without a full page reload.
*/
( function ( mw, $ ) {
+ var jqXhr, $multipageimage, $spinner;
- // Initialize ajax request variable
- var xhr;
-
- // Use jQuery's load function to specifically select and replace table.multipageimage's child
- // tr with the new page's table.multipageimage's tr element.
- // table.multipageimage always has only one row.
- function loadPage( page, hist ) {
- if ( xhr ) {
- // Abort previous requests to prevent backlog created by
- // repeatedly pressing back/forwards buttons
- xhr.abort();
+ /* Fetch the next page and use jQuery to swap the table.multipageimage contents.
+ * @param {string} url
+ * @param {boolean} [hist=false] Whether this is a load triggered by history navigation (if
+ * true, this function won't push a new history state, for the browser did so already).
+ */
+ function loadPage( url, hist ) {
+ var $tr;
+ if ( jqXhr ) {
+ // Prevent race conditions and piling up pending requests
+ jqXhr.abort();
+ jqXhr = undefined;
}
- var $multipageimage = $( 'table.multipageimage' ),
- $spinner;
-
// Add a new spinner if one doesn't already exist
- if ( !$multipageimage.find( '.mw-spinner' ).length ) {
-
+ if ( !$spinner ) {
+ $tr = $multipageimage.find( 'tr' );
$spinner = $.createSpinner( {
size: 'large',
type: 'block'
} )
- // Set the spinner's dimensions equal to the table's dimensions so that
- // the current scroll position is not lost after the table is emptied prior to
- // its contents being updated
+ // Copy the old content dimensions equal so that the current scroll position is not
+ // lost between emptying the table is and receiving the new contents.
.css( {
- height: $multipageimage.find( 'tr' ).height(),
- width: $multipageimage.find( 'tr' ).width()
+ height: $tr.outerHeight(),
+ width: $tr.outerWidth()
} );
$multipageimage.empty().append( $spinner );
}
- xhr = $.ajax( {
- url: page,
- success: function ( data ) {
- // Load the page
- $multipageimage.empty().append( $( data ).find( 'table.multipageimage tr' ) );
- // Fire hook because the page's content has changed
- mw.hook( 'wikipage.content' ).fire( $multipageimage );
- // Set up the new page for pagination
- ajaxifyPageNavigation();
- // Add new page of image to history. To preserve the back-forwards chain in the browser,
- // if the user gets here via the back/forward button, don't update the history.
- if ( window.history && history.pushState && !hist ) {
- history.pushState( { url: page }, document.title, page );
- }
+ // @todo Don't fetch the entire page. Ideally we'd only fetch the content portion or the data
+ // (thumbnail urls) and update the interface manually.
+ jqXhr = $.ajax( url ).done( function ( data ) {
+ jqXhr = $spinner = undefined;
+
+ // Replace table contents
+ $multipageimage.empty().append( $( data ).find( 'table.multipageimage' ).contents() );
+
+ bindPageNavigation( $multipageimage );
+
+ // Fire hook because the page's content has changed
+ mw.hook( 'wikipage.content' ).fire( $multipageimage );
+
+ // Update browser history and address bar. But not if we came here from a history
+ // event, in which case the url is already updated by the browser.
+ if ( history.pushState && !hist ) {
+ history.pushState( { tag: 'mw-pagination' }, document.title, url );
}
} );
}
- function ajaxifyPageNavigation() {
- // Intercept the default action of the links in the thumbnail navigation
- $( '.multipageimagenavbox' ).one( 'click', 'a', function ( e ) {
+ function bindPageNavigation( $container ) {
+ $container.find( '.multipageimagenavbox' ).one( 'click', 'a', function ( e ) {
loadPage( this.href );
e.preventDefault();
} );
- // Prevent the submission of the page select form and instead call loadPage
- $( 'form[name="pageselector"]' ).one( 'change submit', function ( e ) {
+ $container.find( 'form[name="pageselector"]' ).one( 'change submit', function ( e ) {
loadPage( this.action + '?' + $( this ).serialize() );
e.preventDefault();
} );
}
- $( document ).ready( function () {
- // The presence of table.multipageimage signifies that this file is a multi-page image
- if ( mw.config.get( 'wgNamespaceNumber' ) === 6 && $( 'table.multipageimage' ).length !== 0 ) {
- ajaxifyPageNavigation();
+ $( function () {
+ if ( mw.config.get( 'wgNamespaceNumber' ) !== 6 ) {
+ return;
+ }
+ $multipageimage = $( 'table.multipageimage' );
+ if ( !$multipageimage.length ) {
+ return;
+ }
- // Set up history.pushState (if available), so that when the user browses to a new page of
- // the same file, the browser's history is updated. If the user clicks the back/forward button
- // in the midst of navigating a file's pages, load the page inline.
- if ( window.history && history.pushState && history.replaceState ) {
- history.replaceState( { url: window.location.href }, '' );
- $( window ).on( 'popstate', function ( e ) {
- var state = e.originalEvent.state;
- if ( state ) {
- loadPage( state.url, true );
- }
- } );
- }
+ bindPageNavigation( $multipageimage );
+
+ // Update the url using the History API (if available)
+ if ( history.pushState && history.replaceState ) {
+ history.replaceState( { tag: 'mw-pagination' }, '' );
+ $( window ).on( 'popstate', function ( e ) {
+ var state = e.originalEvent.state;
+ if ( state && state.tag === 'mw-pagination' ) {
+ loadPage( location.href, true );
+ }
+ } );
}
} );
}( mediaWiki, jQuery ) );
&.mw-halign-center {
margin: 0 auto .5em auto;
+ display: table;
clear: none;
float: none;
}
margin: 4px;
}
+/* Hide the caption for frameless and plain floated images */
+figure[typeof~="mw:Image/Frameless"] > figcaption,
+figure[typeof~="mw:Image"] > figcaption { display: none }
+
/*
* Finally, some basic styling for Parsoid render testing.
* Only Parsoid directly sets .mw-body-content directly on the body, so this
];
$( searchboxesSelectors.join( ', ' ) )
.suggestions( {
- fetch: function ( query ) {
- var $textbox = this,
- node = this[0];
+ fetch: function ( query, response ) {
+ var node = this[0];
api = api || new mw.Api();
namespace: 0,
suggest: ''
} ).done( function ( data ) {
- $textbox.suggestions( 'suggestions', data[1] );
+ response( data[ 1 ] );
} ) );
},
cancel: function () {
return true;
}
},
- delay: 120,
+ cache: true,
highlightInput: true
} )
.bind( 'paste cut drop', function () {
--- /dev/null
+== GNU GENERAL PUBLIC LICENSE ==
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+=== Preamble ===
+
+The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+== TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ==
+
+'''0.''' This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+'''1.''' You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+'''2.''' You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ '''a)''' You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ '''b)''' You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ '''c)''' If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+'''3.''' You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ '''a)''' Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ '''b)''' Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ '''c)''' Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+'''4.''' You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+'''5.''' You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+'''6.''' Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+'''7.''' If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+'''8.''' If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+'''9.''' The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+'''10.''' If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+=== NO WARRANTY ===
+
+'''11.''' BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+'''12.''' IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ '''END OF TERMS AND CONDITIONS'''
+
+== How to Apply These Terms to Your New Programs ==
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
--- /dev/null
+/* 6.0 - only fixes */
+/* content area */
+/* workaround for various ie float bugs */
+div#column-content {
+ float: none;
+ margin-left: 0;
+ height: 1%;
+}
+
+div#column-content div#content {
+ margin-left: 12.2em;
+ margin-top: 3em;
+ height: 1%;
+}
+
+.rtl div#column-content div#content {
+ margin-right: 12.2em;
+ margin-left: 0;
+}
+
+div#column-one {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 4;
+}
+
+.rtl div#column-one {
+ left: auto;
+ right: 0;
+}
+
+div#footer {
+ margin-left: 13.6em;
+ border-left: 1px solid #fabd23;
+}
+
+.rtl div#footer {
+ margin-left: 0;
+ margin-right: 13.6em;
+ border-left: none;
+ border-right: 1px solid #fabd23;
+}
+
+/* float/negative margin brokenness */
+* html div#footer {
+ margin-top: 0;
+}
+
+* html div#column-content {
+ display: inline;
+ margin-bottom: 0;
+}
+
+/* the tabs */
+
+#p-cactions {
+ z-index: 3;
+}
+
+#p-cactions li {
+ padding-bottom: 0 !important;
+ border: none;
+ background-color: transparent;
+ cursor: default;
+ float: none !important;
+}
+
+#p-cactions li a {
+ display: inline-block !important;
+ vertical-align: top;
+ padding-bottom: 0;
+ border: solid #aaa;
+ border-width: 1px 1px 0;
+}
+
+#p-cactions li.selected a {
+ border-color: #fabd23;
+ padding-bottom: 0.17em;
+}
+
+#p-cactions li a:hover {
+ padding-bottom: 0.17em;
+}
+
+#p-navigation a {
+ display: inline-block;
+ width: 100%;
+}
+
+#portal-personaltools {
+ padding-bottom: 0.1em;
+}
+
+.rtl a.feedlink {
+ background-position: right;
+ padding-right: 0;
+ padding-left: 16px;
+}
+
+/* show the hand */
+#p-logo a,
+#p-logo a:hover {
+ cursor: pointer;
+}
+
+div.visualClear {
+ width: 100%;
+ line-height: 0;
+}
+
+textarea {
+ width: 96%;
+}
+
+#catlinks,
+div.tright,
+div.tleft {
+ position: relative;
+}
+
+/* bug 12846 */
+body.rtl #preftoc a, body.rtl #preftoc a:active {
+ float: left;
+}
--- /dev/null
+/* 7.0 - only fixes */
+/* content area */
+/* workaround for various ie float bugs */
+
+/* This bit is needed to make links clickable... WTF */
+div#column-content div#content {
+ margin-left: 12.2em;
+ margin-top: 3em;
+ height: 1%;
+}
+
+.rtl div#column-content div#content {
+ margin-right: 12.2em;
+ margin-left: 0;
+}
+
+.rtl div#column-one {
+ /* For some reason it tries to inherit the padding-top into every div,
+ * and I can't figure out how to get it back off.
+ * Margin works correctly for this use, though.
+ */
+ padding-top: 0;
+ margin-top: 160px;
+}
+
+/* These elements also have padding-left: 20px; in main.css, but in RTL mode this is flipped.
+ * That's good in normal browsers, but in IE7 it needs to not be flipped for some daft reason.
+ * Also clear the right margin (originally margin-left: 1em)
+ */
+li#pt-userpage, li#pt-anonuserpage, li#pt-login {
+ padding-left: 20px;
+ margin-right: 0;
+}
+
+.rtl a.feedlink {
+ background-position: right;
+ padding-right: 0;
+ padding-left: 16px;
+}
+
+/* the tabs */
+
+#p-cactions {
+ z-index: 3;
+}
+
+#p-cactions li {
+ padding-bottom: 0 !important;
+ border: none;
+ background-color: transparent;
+ cursor: default;
+ float: none !important;
+}
+
+#p-cactions li a {
+ display: inline-block !important;
+ vertical-align: top;
+ padding-bottom: 0;
+ border: solid #aaa;
+ border-width: 1px 1px 0;
+}
+
+#p-cactions li.selected a {
+ border-color: #fabd23;
+ padding-bottom: 0.17em;
+}
+
+#p-cactions li a:hover {
+ padding-bottom: 0.17em;
+}
+
+#p-navigation a {
+ display: inline-block;
+ width: 100%;
+}
+
+#portal-personaltools {
+ padding-bottom: 0.1em;
+}
+
+textarea {
+ width: 96%;
+}
+
+/*
+#catlinks,
+div.tright,
+div.tleft {
+ position: relative;
+}
+*/
+
+div#footer li {
+ /* Work around bug with inline <li> tags with right margins and nowrap */
+ margin-right: 0;
+}
--- /dev/null
+<?php
+/**
+ * MonoBook nouveau.
+ *
+ * Translated from gwicke's previous TAL template version to remove
+ * dependency on PHPTAL.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Skins
+ */
+
+$wgExtensionCredits['skin'][] = array(
+ 'path' => __FILE__,
+ 'name' => 'MonoBook',
+ 'namemsg' => 'skinname-monobook',
+ 'descriptionmsg' => 'monobook-desc',
+ 'url' => 'https://www.mediawiki.org/wiki/Skin:MonoBook',
+ 'author' => array( 'Gabriel Wicke', '...' ),
+ 'license-name' => 'GPLv2+',
+);
+
+// Register files
+$wgAutoloadClasses['SkinMonoBook'] = __DIR__ . '/SkinMonoBook.php';
+$wgAutoloadClasses['MonoBookTemplate'] = __DIR__ . '/MonoBookTemplate.php';
+$wgMessagesDirs['MonoBook'] = __DIR__ . '/i18n';
+
+// Register skin
+$wgValidSkinNames['monobook'] = 'MonoBook';
+
+// Register modules
+$wgResourceModules['skins.monobook.styles'] = array(
+ 'styles' => array(
+ 'main.css' => array( 'media' => 'screen' ),
+ ),
+ 'remoteSkinPath' => 'MonoBook',
+ 'localBasePath' => __DIR__,
+);
--- /dev/null
+<?php
+/**
+ * MonoBook nouveau.
+ *
+ * Translated from gwicke's previous TAL template version to remove
+ * dependency on PHPTAL.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Skins
+ */
+
+/**
+ * @ingroup Skins
+ */
+class MonoBookTemplate extends BaseTemplate {
+
+ /**
+ * Template filter callback for MonoBook skin.
+ * Takes an associative array of data set from a SkinTemplate-based
+ * class, and a wrapper for MediaWiki's localization database, and
+ * outputs a formatted page.
+ *
+ * @access private
+ */
+ function execute() {
+ // Suppress warnings to prevent notices about missing indexes in $this->data
+ wfSuppressWarnings();
+
+ $this->html( 'headelement' );
+ ?><div id="globalWrapper">
+ <div id="column-content">
+ <div id="content" class="mw-body-primary" role="main">
+ <a id="top"></a>
+ <?php
+ if ( $this->data['sitenotice'] ) {
+ ?>
+ <div id="siteNotice"><?php
+ $this->html( 'sitenotice' )
+ ?></div><?php
+ }
+ ?>
+
+ <h1 id="firstHeading" class="firstHeading" lang="<?php
+ $this->data['pageLanguage'] =
+ $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+ $this->text( 'pageLanguage' );
+ ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
+
+ <div id="bodyContent" class="mw-body">
+ <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+ <div id="contentSub"<?php
+ $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' )
+ ?></div>
+ <?php if ( $this->data['undelete'] ) { ?>
+ <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
+ <?php
+}
+ ?><?php
+ if ( $this->data['newtalk'] ) {
+ ?>
+ <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
+ <?php
+ }
+ ?>
+ <div id="jump-to-nav" class="mw-jump"><?php
+ $this->msg( 'jumpto' )
+ ?> <a href="#column-one"><?php
+ $this->msg( 'jumptonavigation' )
+ ?></a><?php
+ $this->msg( 'comma-separator' )
+ ?><a href="#searchInput"><?php
+ $this->msg( 'jumptosearch' )
+ ?></a></div>
+
+ <!-- start content -->
+ <?php $this->html( 'bodytext' ) ?>
+ <?php
+ if ( $this->data['catlinks'] ) {
+ $this->html( 'catlinks' );
+ }
+ ?>
+ <!-- end content -->
+ <?php
+ if ( $this->data['dataAfterContent'] ) {
+ $this->html( 'dataAfterContent'
+ );
+ }
+ ?>
+ <div class="visualClear"></div>
+ </div>
+ </div>
+ </div>
+ <div id="column-one"<?php $this->html( 'userlangattributes' ) ?>>
+ <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
+ <?php $this->cactions(); ?>
+ <div class="portlet" id="p-personal" role="navigation">
+ <h3><?php $this->msg( 'personaltools' ) ?></h3>
+
+ <div class="pBody">
+ <ul<?php $this->html( 'userlangattributes' ) ?>>
+ <?php foreach ( $this->getPersonalTools() as $key => $item ) { ?>
+ <?php echo $this->makeListItem( $key, $item ); ?>
+
+ <?php
+}
+ ?>
+ </ul>
+ </div>
+ </div>
+ <div class="portlet" id="p-logo" role="banner">
+ <?php
+ echo Html::element( 'a', array(
+ 'href' => $this->data['nav_urls']['mainpage']['href'],
+ 'style' => "background-image: url({$this->data['logopath']});" )
+ + Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ); ?>
+
+ </div>
+ <?php
+ $this->renderPortals( $this->data['sidebar'] );
+ ?>
+ </div><!-- end of the left (by default at least) column -->
+ <div class="visualClear"></div>
+ <?php
+ $validFooterIcons = $this->getFooterIcons( "icononly" );
+ $validFooterLinks = $this->getFooterLinks( "flat" ); // Additional footer links
+
+ if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) {
+ ?>
+ <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
+ <?php
+ $footerEnd = '</div>';
+ } else {
+ $footerEnd = '';
+ }
+
+ foreach ( $validFooterIcons as $blockName => $footerIcons ) {
+ ?>
+ <div id="f-<?php echo htmlspecialchars( $blockName ); ?>ico">
+ <?php foreach ( $footerIcons as $icon ) { ?>
+ <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
+
+ <?php
+}
+ ?>
+ </div>
+ <?php
+ }
+
+ if ( count( $validFooterLinks ) > 0 ) {
+ ?>
+ <ul id="f-list">
+ <?php
+ foreach ( $validFooterLinks as $aLink ) {
+ ?>
+ <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
+ <?php
+ }
+ ?>
+ </ul>
+ <?php
+ }
+
+ echo $footerEnd;
+ ?>
+
+ </div>
+ <?php
+ $this->printTrail();
+ echo Html::closeElement( 'body' );
+ echo Html::closeElement( 'html' );
+ wfRestoreWarnings();
+ } // end of execute() method
+
+ /*************************************************************************************************/
+
+ /**
+ * @param array $sidebar
+ */
+ protected function renderPortals( $sidebar ) {
+ if ( !isset( $sidebar['SEARCH'] ) ) {
+ $sidebar['SEARCH'] = true;
+ }
+ if ( !isset( $sidebar['TOOLBOX'] ) ) {
+ $sidebar['TOOLBOX'] = true;
+ }
+ if ( !isset( $sidebar['LANGUAGES'] ) ) {
+ $sidebar['LANGUAGES'] = true;
+ }
+
+ foreach ( $sidebar as $boxName => $content ) {
+ if ( $content === false ) {
+ continue;
+ }
+
+ if ( $boxName == 'SEARCH' ) {
+ $this->searchBox();
+ } elseif ( $boxName == 'TOOLBOX' ) {
+ $this->toolbox();
+ } elseif ( $boxName == 'LANGUAGES' ) {
+ $this->languageBox();
+ } else {
+ $this->customBox( $boxName, $content );
+ }
+ }
+ }
+
+ function searchBox() {
+ global $wgUseTwoButtonsSearchForm;
+ ?>
+ <div id="p-search" class="portlet" role="search">
+ <h3><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
+
+ <div id="searchBody" class="pBody">
+ <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
+ <input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
+ <?php echo $this->makeSearchInput( array( "id" => "searchInput" ) ); ?>
+
+ <?php
+ echo $this->makeSearchButton(
+ "go",
+ array( "id" => "searchGoButton", "class" => "searchButton" )
+ );
+
+ if ( $wgUseTwoButtonsSearchForm ) {
+ ?> 
+ <?php echo $this->makeSearchButton(
+ "fulltext",
+ array( "id" => "mw-searchButton", "class" => "searchButton" )
+ );
+ } else {
+ ?>
+
+ <div><a href="<?php
+ $this->text( 'searchaction' )
+ ?>" rel="search"><?php $this->msg( 'powersearch-legend' ) ?></a></div><?php
+ } ?>
+
+ </form>
+
+ <?php $this->renderAfterPortlet( 'search' ); ?>
+ </div>
+ </div>
+ <?php
+ }
+
+ /**
+ * Prints the cactions bar.
+ * Shared between MonoBook and Modern
+ */
+ function cactions() {
+ ?>
+ <div id="p-cactions" class="portlet" role="navigation">
+ <h3><?php $this->msg( 'views' ) ?></h3>
+
+ <div class="pBody">
+ <ul><?php
+ foreach ( $this->data['content_actions'] as $key => $tab ) {
+ echo '
+ ' . $this->makeListItem( $key, $tab );
+ } ?>
+
+ </ul>
+ <?php $this->renderAfterPortlet( 'cactions' ); ?>
+ </div>
+ </div>
+ <?php
+ }
+
+ /*************************************************************************************************/
+ function toolbox() {
+ ?>
+ <div class="portlet" id="p-tb" role="navigation">
+ <h3><?php $this->msg( 'toolbox' ) ?></h3>
+
+ <div class="pBody">
+ <ul>
+ <?php
+ foreach ( $this->getToolbox() as $key => $tbitem ) {
+ ?>
+ <?php echo $this->makeListItem( $key, $tbitem ); ?>
+
+ <?php
+ }
+ wfRunHooks( 'MonoBookTemplateToolboxEnd', array( &$this ) );
+ wfRunHooks( 'SkinTemplateToolboxEnd', array( &$this, true ) );
+ ?>
+ </ul>
+ <?php $this->renderAfterPortlet( 'tb' ); ?>
+ </div>
+ </div>
+ <?php
+ }
+
+ /*************************************************************************************************/
+ function languageBox() {
+ if ( $this->data['language_urls'] !== false ) {
+ ?>
+ <div id="p-lang" class="portlet" role="navigation">
+ <h3<?php $this->html( 'userlangattributes' ) ?>><?php $this->msg( 'otherlanguages' ) ?></h3>
+
+ <div class="pBody">
+ <ul>
+ <?php foreach ( $this->data['language_urls'] as $key => $langlink ) { ?>
+ <?php echo $this->makeListItem( $key, $langlink ); ?>
+
+ <?php
+}
+ ?>
+ </ul>
+
+ <?php $this->renderAfterPortlet( 'lang' ); ?>
+ </div>
+ </div>
+ <?php
+ }
+ }
+
+ /*************************************************************************************************/
+ /**
+ * @param string $bar
+ * @param array|string $cont
+ */
+ function customBox( $bar, $cont ) {
+ $portletAttribs = array(
+ 'class' => 'generated-sidebar portlet',
+ 'id' => Sanitizer::escapeId( "p-$bar" ),
+ 'role' => 'navigation'
+ );
+
+ $tooltip = Linker::titleAttrib( "p-$bar" );
+ if ( $tooltip !== false ) {
+ $portletAttribs['title'] = $tooltip;
+ }
+ echo ' ' . Html::openElement( 'div', $portletAttribs );
+ $msgObj = wfMessage( $bar );
+ ?>
+
+ <h3><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $bar ); ?></h3>
+ <div class='pBody'>
+ <?php
+ if ( is_array( $cont ) ) {
+ ?>
+ <ul>
+ <?php
+ foreach ( $cont as $key => $val ) {
+ ?>
+ <?php echo $this->makeListItem( $key, $val ); ?>
+
+ <?php
+ }
+ ?>
+ </ul>
+ <?php
+ } else {
+ # allow raw HTML block to be defined by extensions
+ print $cont;
+ }
+
+ $this->renderAfterPortlet( $bar );
+ ?>
+ </div>
+ </div>
+ <?php
+ }
+} // end of class
--- /dev/null
+<?php
+/**
+ * MonoBook nouveau.
+ *
+ * Translated from gwicke's previous TAL template version to remove
+ * dependency on PHPTAL.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Skins
+ */
+
+/**
+ * Inherit main code from SkinTemplate, set the CSS and template filter.
+ * @ingroup Skins
+ */
+class SkinMonoBook extends SkinTemplate {
+ /** Using MonoBook. */
+ public $skinname = 'monobook';
+ public $stylename = 'MonoBook';
+ public $template = 'MonoBookTemplate';
+
+ /**
+ * @param OutputPage $out
+ */
+ function setupSkinUserCss( OutputPage $out ) {
+ parent::setupSkinUserCss( $out );
+
+ $out->addModuleStyles( array( 'mediawiki.skinning.interface', 'skins.monobook.styles' ) );
+
+ // TODO: Migrate all of these
+ $out->addStyle( $this->stylename . '/IE60Fixes.css', 'screen', 'IE 6' );
+ $out->addStyle( $this->stylename . '/IE70Fixes.css', 'screen', 'IE 7' );
+ }
+}
--- /dev/null
+{
+ "@metadata": {
+ "authors": []
+ },
+ "skinname-monobook": "MonoBook",
+ "monobook-desc": "The classic MediaWiki skin since 2004, named after the black-and-white photo of a book in the page background",
+ "monobook.css": "/* CSS placed here will affect users of the MonoBook skin */",
+ "monobook.js": "/* Any JavaScript here will be loaded for users using the MonoBook skin */"
+}
--- /dev/null
+{
+ "@metadata": {
+ "authors": []
+ },
+ "skinname-monobook": "{{optional}}",
+ "monobook-desc": "{{desc|name=MonoBook|url=http://www.mediawiki.org/wiki/Skin:MonoBook}}",
+ "monobook.css": "{{optional}}\nCSS applied to users using MonoBook skin.",
+ "monobook.js": "{{optional}}\nJS for users using MonoBook skin."
+}
--- /dev/null
+/*
+** MediaWiki 'monobook' style sheet for CSS2-capable browsers.
+** Copyright Gabriel Wicke - http://wikidev.net/
+** License: GPL (http://www.gnu.org/copyleft/gpl.html)
+**
+** Loosely based on http://www.positioniseverything.net/ordered-floats.html by Big John
+** and the Plone 2.0 styles, see http://plone.org/ (Alexander Limi,Joe Geldart & Tom Croucher,
+** Michael Zeltner and Geir Bækholt)
+** All you guys rock :)
+*/
+
+div#column-content {
+ width: 100%;
+ float: right;
+ margin: 0 0 .6em -12.2em;
+ padding: 0;
+}
+
+div#content {
+ margin: 2.8em 0 0 12.2em;
+ padding: 1em;
+ position: relative;
+ z-index: 2;
+}
+
+div#column-one {
+ padding-top: 160px;
+}
+
+/* Hide, but keep accessible for screen-readers */
+#column-one h2 {
+ position: absolute;
+ top: -9999px;
+}
+
+div#content {
+ background: white;
+ color: black;
+ border: 1px solid #aaa;
+ border-right: none;
+ line-height: 1.5em;
+}
+
+/* the left column width is specified in class .portlet */
+
+/* Font size:
+** We take advantage of keyword scaling- browsers won't go below 9px
+** More at http://www.w3.org/2003/07/30-font-size
+** http://style.cleverchimp.com/font_size_intervals/altintervals.html
+*/
+
+body {
+ font: x-small sans-serif;
+ /* @embed */
+ background: #f9f9f9 url(headbg.jpg) 0 0 no-repeat;
+ color: black;
+ margin: 0;
+ padding: 0;
+ direction: ltr; /* Needed for RTL flipping */
+ unicode-bidi: embed;
+}
+
+/* scale back up to a sane default */
+div#globalWrapper {
+ font-size: 127%;
+ width: 100%;
+ margin: 0;
+ padding: 0;
+}
+
+/* general styles */
+a {
+ color: #002bb8;
+}
+
+a:visited {
+ color: #5a3696;
+}
+
+a.new,
+#p-personal a.new {
+ color: #cc2200;
+}
+
+ul {
+ list-style-type: square;
+ /* @embed */
+ list-style-image: url(bullet.gif);
+}
+
+input.historysubmit {
+ padding: 0 .3em .3em .3em !important;
+ font-size: 94%;
+ cursor: pointer;
+ height: 1.7em !important;
+ margin-left: 1.6em;
+}
+
+pre, .mw-code {
+ line-height: 1.1em;
+}
+
+#firstHeading {
+ padding-top: 0;
+}
+
+/*
+** the main content area
+*/
+
+#siteNotice {
+ font-size: 95%;
+ padding: 0 0.9em;
+}
+
+#localNotice {
+ margin: 0;
+}
+
+#siteNotice p {
+ margin: 0;
+ padding: 0;
+}
+
+/*
+** classes for special content elements like town boxes
+** intended to be referenced directly from the wiki src
+*/
+
+/*
+** User styles
+*/
+/* table standards */
+table.rimage {
+ float: right;
+ position: relative;
+ margin-left: 1em;
+ margin-bottom: 1em;
+ text-align: center;
+}
+
+/*
+** edit views etc
+*/
+.special li {
+ line-height: 1.4em;
+ margin: 0;
+ padding: 0;
+}
+
+/*
+** keep the whitespace in front of the ^=, hides rule from konqueror
+** this is css3, the validator doesn't like it when validating as css2
+*/
+#bodyContent a.external {
+ /* @embed */
+ background: url(external-ltr.png) center right no-repeat;
+ padding-right: 13px;
+}
+
+#bodyContent a.external[href ^="https://"],
+.link-https {
+ /* @embed */
+ background: url(lock_icon.gif) center right no-repeat;
+ padding-right: 16px;
+}
+
+#bodyContent a.external[href ^="mailto:"],
+.link-mailto {
+ /* @embed */
+ background: url(mail_icon.gif) center right no-repeat;
+ padding-right: 18px;
+}
+
+#bodyContent a.external[href ^="news:"] {
+ /* @embed */
+ background: url(news_icon.png) center right no-repeat;
+ padding-right: 18px;
+}
+
+#bodyContent a.external[href ^="ftp://"],
+.link-ftp {
+ /* @embed */
+ background: url(file_icon.gif) center right no-repeat;
+ padding-right: 18px;
+}
+
+#bodyContent a.external[href ^="irc://"],
+#bodyContent a.external[href ^="ircs://"],
+.link-irc {
+ /* @embed */
+ background: url(discussionitem_icon.gif) center right no-repeat;
+ padding-right: 18px;
+}
+
+#bodyContent a.external[href $=".ogg"], #bodyContent a.external[href $=".OGG"],
+#bodyContent a.external[href $=".mid"], #bodyContent a.external[href $=".MID"],
+#bodyContent a.external[href $=".midi"], #bodyContent a.external[href $=".MIDI"],
+#bodyContent a.external[href $=".mp3"], #bodyContent a.external[href $=".MP3"],
+#bodyContent a.external[href $=".wav"], #bodyContent a.external[href $=".WAV"],
+#bodyContent a.external[href $=".wma"], #bodyContent a.external[href $=".WMA"],
+.link-audio {
+ /* @embed */
+ background: url(audio.png) center right no-repeat;
+ padding-right: 13px;
+}
+
+#bodyContent a.external[href $=".ogm"], #bodyContent a.external[href $=".OGM"],
+#bodyContent a.external[href $=".avi"], #bodyContent a.external[href $=".AVI"],
+#bodyContent a.external[href $=".mpeg"], #bodyContent a.external[href $=".MPEG"],
+#bodyContent a.external[href $=".mpg"], #bodyContent a.external[href $=".MPG"],
+.link-video {
+ /* @embed */
+ background: url(video.png) center right no-repeat;
+ padding-right: 13px;
+}
+
+#bodyContent a.external[href $=".pdf"], #bodyContent a.external[href $=".PDF"],
+#bodyContent a.external[href *=".pdf#"], #bodyContent a.external[href *=".PDF#"],
+#bodyContent a.external[href *=".pdf?"], #bodyContent a.external[href *=".PDF?"],
+.link-document {
+ /* @embed */
+ background: url(document.png) center right no-repeat;
+ padding-right: 12px;
+}
+
+/* Interwiki Styling */
+#bodyContent a.extiw,
+#bodyContent a.extiw:active {
+ color: #36b;
+}
+
+/* External links */
+#bodyContent a.external {
+ color: #36b;
+}
+
+/*
+** Structural Elements
+*/
+
+/*
+** general portlet styles (elements in the quickbar)
+*/
+.portlet {
+ border: none;
+ margin: 0 0 .5em;
+ padding: 0;
+ float: none;
+ width: 11.6em;
+ overflow: hidden;
+}
+
+.portlet h3 {
+ background: transparent;
+ padding: 0 1em 0 .5em;
+ display: inline;
+ height: 1em;
+ text-transform: lowercase;
+ font-size: 91%;
+ font-weight: normal;
+ white-space: nowrap;
+}
+
+.pBody {
+ font-size: 95%;
+ background-color: white;
+ color: black;
+ border-collapse: collapse;
+ border: 1px solid #aaa;
+ padding: 0 .8em .3em .5em;
+}
+
+/* allows .pBody styles to wrap around content added via BaseTemplateAfterPortlet hook */
+.pBody:after {
+ content: '';
+ clear: both;
+ display: block;
+}
+
+.portlet ul {
+ line-height: 1.5em;
+ font-size: 95%;
+}
+
+.portlet li {
+ padding: 0;
+ margin: 0;
+}
+
+/*
+** Logo properties
+*/
+
+#p-logo {
+ top: 0;
+ left: 0;
+ position: absolute; /*needed to use z-index */
+ z-index: 3;
+ height: 155px;
+ width: 12em;
+ overflow: visible;
+}
+
+#p-logo h3 {
+ display: none;
+}
+
+#p-logo a,
+#p-logo a:hover {
+ display: block;
+ height: 155px;
+ width: 12.2em;
+ background-repeat: no-repeat;
+ background-position: 35% 50% !important;
+ text-decoration: none;
+}
+
+/*
+** Search portlet
+*/
+#p-search {
+ position: relative;
+ z-index: 3;
+}
+
+input.searchButton {
+ margin-top: 1px;
+ font-size: 95%;
+}
+
+#searchGoButton {
+ padding-left: .5em;
+ padding-right: .5em;
+ font-weight: bold;
+}
+
+#searchInput {
+ width: 10.9em;
+ margin: 0;
+ font-size: 95%;
+}
+
+#p-search .pBody {
+ padding: .5em .4em .4em .4em;
+ text-align: center;
+}
+
+#p-search #searchform div div {
+ margin-top: .4em;
+ font-size: 95%;
+}
+
+/*
+** the personal toolbar
+*/
+#p-personal {
+ position: absolute;
+ left: 0;
+ top: 0;
+ z-index: 3;
+}
+
+#p-personal {
+ width: 100%;
+ white-space: nowrap;
+ padding: 0;
+ margin: 0;
+ border: none;
+ background: none;
+ overflow: visible;
+ line-height: 1.2em;
+}
+
+#p-personal h3 {
+ display: none;
+}
+
+#p-personal .portlet,
+#p-personal .pBody {
+ z-index: 0;
+ padding: 0;
+ margin: 0;
+ border: none;
+ overflow: visible;
+ background: none;
+}
+
+/* this is the ul contained in the portlet */
+#p-personal ul {
+ border: none;
+ line-height: 1.4em;
+ color: #2f6fab;
+ padding: 0 2em 0 3em;
+ margin: 0;
+ text-align: right;
+ list-style-type: none;
+ list-style-image: none;
+ z-index: 0;
+ background: none;
+ cursor: default;
+}
+
+#p-personal li {
+ z-index: 0;
+ border: none;
+ padding: 0;
+ display: inline;
+ color: #2f6fab;
+ margin-left: 1em;
+ line-height: 1.2em;
+ background: none;
+}
+
+#p-personal li a {
+ text-decoration: none;
+ color: #005896;
+ padding-bottom: .2em;
+ background: none;
+}
+
+#p-personal li a:hover {
+ background-color: white;
+ padding-bottom: .2em;
+ text-decoration: none;
+}
+
+#p-personal li.active a:hover {
+ background-color: transparent;
+}
+
+/* The icon in front of the username / login link */
+li#pt-userpage,
+li#pt-anonuserpage,
+li#pt-login {
+ /* @embed */
+ background: url(user.gif) top left no-repeat;
+ padding-left: 20px;
+}
+
+#p-personal ul {
+ text-transform: lowercase;
+}
+
+/* Don't lowercase username or IP addresses (IPv6) */
+li#pt-userpage,
+li#pt-anonuserpage {
+ text-transform: none;
+}
+
+#p-personal li.active {
+ font-weight: bold;
+}
+
+/*
+** the page-related actions- page/talk, edit etc
+*/
+#p-cactions {
+ position: absolute;
+ top: 1.3em;
+ left: 11.5em;
+ margin: 0;
+ white-space: nowrap;
+ width: 76%;
+ line-height: 1.1em;
+ overflow: visible;
+ background: none;
+ border-collapse: collapse;
+ padding-left: 1em;
+ font-size: 95%;
+}
+
+#p-cactions ul {
+ list-style-type: none;
+ list-style-image: none;
+}
+
+#p-cactions li {
+ display: inline;
+ border: 1px solid #aaa;
+ border-bottom: none;
+ padding: 0 0 1em 0;
+ margin: 0 .3em 0 0;
+ overflow: visible;
+ background: white;
+}
+
+#p-cactions li.selected {
+ border-color: #fabd23;
+ font-weight: bold;
+}
+
+#p-cactions li a {
+ background-color: #fbfbfb;
+ color: #002bb8;
+ border: none;
+ padding: 0 .8em .3em;
+ position: relative;
+ z-index: 0;
+ margin: 0;
+ text-decoration: none;
+}
+
+#p-cactions li.selected a {
+ z-index: 3;
+ background-color: white;
+}
+
+#p-cactions .new a {
+ color: #ba0000;
+}
+
+#p-cactions li a:hover {
+ z-index: 3;
+ text-decoration: none;
+ background-color: white;
+}
+
+#p-cactions h3 {
+ display: none;
+}
+
+#p-cactions li.istalk {
+ margin-right: 0;
+}
+
+#p-cactions li.istalk a {
+ padding-right: .5em;
+}
+
+#p-cactions #ca-addsection a {
+ padding-left: .4em;
+ padding-right: .4em;
+}
+
+/* offsets to distinguish the tab groups */
+li#ca-talk {
+ margin-right: 1.6em;
+}
+
+li#ca-watch,
+li#ca-unwatch,
+li#ca-varlang-0,
+li#ca-print {
+ margin-left: 1.6em;
+}
+
+#p-cactions .pBody {
+ font-size: 1em;
+ background-color: transparent;
+ color: inherit;
+ border-collapse: inherit;
+ border: 0;
+ padding: 0;
+}
+
+#p-cactions li a {
+ text-transform: lowercase;
+}
+
+#p-lang {
+ position: relative;
+ z-index: 3;
+}
+
+/* Override text-transform on languages where capitalization is significant */
+.capitalize-all-nouns .portlet h3,
+.capitalize-all-nouns #p-personal ul,
+.capitalize-all-nouns #p-cactions ul li a {
+ text-transform: none;
+}
+
+/* TODO: #t-iscite is only used by the Cite extension, come up with some
+ * system which allows extensions to add to this file on the fly
+ */
+#t-ispermalink, #t-iscite {
+ color: #999;
+}
+
+/*
+** footer
+*/
+div#footer {
+ background-color: white;
+ border-top: 1px solid #fabd23;
+ border-bottom: 1px solid #fabd23;
+ margin: .6em 0 1em 0;
+ overflow: hidden;
+ padding: .4em 0 .3em 0;
+ text-align: center;
+ font-size: 90%;
+}
+
+div#footer li {
+ display: inline;
+ margin: 0 1.3em;
+}
+
+#f-poweredbyico, #f-copyrightico {
+ margin: 0 8px;
+ position: relative;
+ top: -2px; /* Bump it up just a tad */
+}
+
+#f-poweredbyico {
+ float: right;
+ height: 1%;
+}
+
+#f-copyrightico {
+ float: left;
+ height: 1%;
+}
+
+.mw-htmlform-submit {
+ font-weight: bold;
+ padding-left: .3em;
+ padding-right: .3em;
+ margin-right: 2em;
+}
+
+/* js pref toc */
+#preftoc {
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ clear: both;
+}
+
+#preftoc li {
+ background-color: #f0f0f0;
+ color: #000;
+}
+
+#preftoc li {
+ margin: 1px -2px 1px 2px;
+ float: left;
+ padding: 2px 0 3px 0;
+ border: 1px solid #fff;
+ border-right-color: #716f64;
+ border-bottom: 0;
+ position: relative;
+ white-space: nowrap;
+ list-style-type: none;
+ list-style-image: none;
+ z-index: 3;
+}
+
+#preftoc li.selected {
+ font-weight: bold;
+ background-color: #f9f9f9;
+ border: 1px solid #aaa;
+ border-bottom: none;
+ cursor: default;
+ top: 1px;
+ padding-top: 2px;
+ margin-right: -3px;
+}
+
+#preftoc > li.selected {
+ top: 2px;
+}
+
+#preftoc a,
+#preftoc a:active {
+ display: block;
+ color: #000;
+ padding: 0 .7em;
+ position: relative;
+ text-decoration: none;
+}
+
+#preftoc li.selected a {
+ cursor: default;
+ text-decoration: none;
+}
+
+#preferences {
+ margin: 0;
+ border: 1px solid #aaa;
+ clear: both;
+ padding: 1.5em;
+ background-color: #F9F9F9;
+}
+
+.prefsection {
+ border: none;
+ padding: 0;
+ margin: 0;
+}
+
+.prefsection legend {
+ font-weight: bold;
+}
+
+.prefsection table, .prefsection legend {
+ background-color: #F9F9F9;
+}
+
+.mainLegend {
+ display: none;
+}
+
+td.htmlform-tip {
+ font-size: x-small;
+ padding: .2em 2em;
+ color: #666;
+}
+
+.preferences-login {
+ clear: both;
+ margin-bottom: 1.5em;
+}
+
+.prefcache {
+ font-size: 90%;
+ margin-top: 2em;
+}
+
+#userloginprompt, #languagelinks {
+ font-size: 85%;
+}
+
+#login-sectiontip {
+ font-size: 85%;
+ line-height: 1.2;
+ padding-top: 2em;
+}
+
+#userloginlink a, #wpLoginattempt, #wpCreateaccount {
+ font-weight: bold;
+}
+
+/**
+ * This was originally added by Gabriel Wicke in r3681 (committed on 25 May 2004)
+ * with the commit message "tweaks to page history".
+ * Unlike the other IE/Mac fixes that used to be present here, this seems to get
+ * applied on more modern browsers, so let's keep it here until someone has the
+ * time to properly test it out.
+ */
+#pagehistory li.selected {
+ position: relative;
+}
+
+.redirectText {
+ font-size: 150%;
+ margin: 5px;
+}
+
+div.patrollink {
+ clear: both;
+}
+
+.sharedUploadNotice {
+ font-style: italic;
+}
+
+span.updatedmarker {
+ color: black;
+ background-color: #0f0;
+}
+
+.editExternally {
+ border: 1px solid gray;
+ background-color: #ffffff;
+ padding: 3px;
+ margin-top: 0.5em;
+ float: left;
+ font-size: small;
+ text-align: center;
+}
+
+.editExternallyHelp {
+ font-style: italic;
+ color: gray;
+}
+
+.toggle {
+ margin-left: 2em;
+ text-indent: -2em;
+}
+
+/* @bug 1714 */
+input#wpSave,
+input#wpDiff {
+ margin-right: 0.33em;
+}
+
+#wpSave {
+ font-weight: bold;
+}
+
+/* noarticletext */
+div.noarticletext {
+ border: 1px solid #ccc;
+ background: #fff;
+ padding: .2em 1em;
+ color: #000;
+}
+
+div#searchTargetContainer {
+ left: 10px;
+ top: 10px;
+ width: 90%;
+ background: white;
+}
+
+div#searchTarget {
+ padding: 3px;
+ margin: 5px;
+ background: #F0F0F0;
+ border: solid 1px blue;
+}
+
+div#searchTarget ul li {
+ list-style-type: none;
+ list-style-image: none;
+}
+
+div#searchTarget ul li:before {
+ color: orange;
+ content: "\00BB \0020";
+}
+
+div#searchTargetHide {
+ float: right;
+ border: solid 1px black;
+ background: #DCDCDC;
+ padding: 2px;
+}
+
+#powersearch p {
+ margin-top: 0;
+}
+
+div.multipageimagenavbox {
+ border: solid 1px silver;
+ padding: 4px;
+ margin: 1em;
+ background: #f0f0f0;
+}
+
+div.multipageimagenavbox div.thumb {
+ border: none;
+ margin-left: 2em;
+ margin-right: 2em;
+}
+
+div.multipageimagenavbox hr {
+ margin: 6px;
+}
+
+table.multipageimage td {
+ text-align: center;
+}
+
+.templatesUsed {
+ margin-top: 1.5em;
+}
+
+.mw-summary-preview {
+ margin: 0.1em 0;
+}
+
+/* Friendlier slave lag warnings */
+div.mw-lag-warn-normal,
+div.mw-lag-warn-high {
+ padding: 3px;
+ text-align: center;
+ margin: 3px auto;
+}
+
+div.mw-lag-warn-normal {
+ border: 1px solid #FFCC66;
+ background-color: #FFFFCC;
+}
+
+div.mw-lag-warn-high {
+ font-weight: bold;
+ border: 2px solid #FF0033;
+ background-color: #FFCCCC;
+}
+
+.MediaTransformError {
+ background-color: #ccc;
+ padding: 0.1em;
+}
+
+.MediaTransformError td {
+ text-align: center;
+ vertical-align: middle;
+ font-size: 90%;
+}
+
+/* God-damned hack for the crappy layout */
+.os-suggest {
+ font-size: 127%;
+}
+
+/* Sometimes people don't want personal tools to be lowercase! */
+.no-text-transform {
+ text-transform: none;
+}
+
+/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
+.tipsy {
+ font-size: 127%;
+}
+
+/* mediawiki.notification */
+.skin-monobook .mw-notification {
+ box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
+}
--- /dev/null
+== GNU GENERAL PUBLIC LICENSE ==
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+=== Preamble ===
+
+The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+== TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ==
+
+'''0.''' This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+'''1.''' You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+'''2.''' You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ '''a)''' You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ '''b)''' You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ '''c)''' If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+'''3.''' You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ '''a)''' Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ '''b)''' Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ '''c)''' Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+'''4.''' You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+'''5.''' You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+'''6.''' Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+'''7.''' If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+'''8.''' If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+'''9.''' The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+'''10.''' If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+=== NO WARRANTY ===
+
+'''11.''' BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+'''12.''' IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ '''END OF TERMS AND CONDITIONS'''
+
+== How to Apply These Terms to Your New Programs ==
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
--- /dev/null
+<?php
+/**
+ * Vector - Modern version of MonoBook with fresh look and many usability
+ * improvements.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Skins
+ */
+
+/**
+ * SkinTemplate class for Vector skin
+ * @ingroup Skins
+ */
+class SkinVector extends SkinTemplate {
+ public $skinname = 'vector';
+ public $stylename = 'Vector';
+ public $template = 'VectorTemplate';
+
+ protected static $bodyClasses = array( 'vector-animateLayout' );
+
+ /**
+ * Initializes output page and sets up skin-specific parameters
+ * @param OutputPage $out Object to initialize
+ */
+ public function initPage( OutputPage $out ) {
+ global $wgLocalStylePath;
+
+ parent::initPage( $out );
+
+ // Append CSS which includes IE only behavior fixes for hover support -
+ // this is better than including this in a CSS file since it doesn't
+ // wait for the CSS file to load before fetching the HTC file.
+ $min = $this->getRequest()->getFuzzyBool( 'debug' ) ? '' : '.min';
+ $out->addHeadItem( 'csshover',
+ '<!--[if lt IE 7]><style type="text/css">body{behavior:url("' .
+ htmlspecialchars( $wgLocalStylePath ) .
+ "/{$this->stylename}/csshover{$min}.htc\")}</style><![endif]-->"
+ );
+
+ $out->addModules( array( 'skins.vector.js' ) );
+ }
+
+ /**
+ * Loads skin and user CSS files.
+ * @param OutputPage $out
+ */
+ function setupSkinUserCss( OutputPage $out ) {
+ parent::setupSkinUserCss( $out );
+
+ $styles = array( 'mediawiki.skinning.interface', 'skins.vector.styles' );
+ wfRunHooks( 'SkinVectorStyleModules', array( $this, &$styles ) );
+ $out->addModuleStyles( $styles );
+ }
+
+ /**
+ * Adds classes to the body element.
+ *
+ * @param OutputPage $out
+ * @param array &$bodyAttrs Array of attributes that will be set on the body element
+ */
+ function addToBodyAttributes( $out, &$bodyAttrs ) {
+ if ( isset( $bodyAttrs['class'] ) && strlen( $bodyAttrs['class'] ) > 0 ) {
+ $bodyAttrs['class'] .= ' ' . implode( ' ', static::$bodyClasses );
+ } else {
+ $bodyAttrs['class'] = implode( ' ', static::$bodyClasses );
+ }
+ }
+}
--- /dev/null
+<?php
+/**
+ * Vector - Modern version of MonoBook with fresh look and many usability
+ * improvements.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Skins
+ */
+
+$wgExtensionCredits['skin'][] = array(
+ 'path' => __FILE__,
+ 'name' => 'Vector',
+ 'namemsg' => 'skinname-vector',
+ 'descriptionmsg' => 'vector-desc',
+ 'url' => 'https://www.mediawiki.org/wiki/Skin:Vector',
+ 'author' => array( 'Trevor Parscal', 'Roan Kattouw', '...' ),
+ 'license-name' => 'GPLv2+',
+);
+
+// Register files
+$wgAutoloadClasses['SkinVector'] = __DIR__ . '/SkinVector.php';
+$wgAutoloadClasses['VectorTemplate'] = __DIR__ . '/VectorTemplate.php';
+$wgMessagesDirs['Vector'] = __DIR__ . '/i18n';
+
+// Register skin
+$wgValidSkinNames['vector'] = 'Vector';
+
+// Register modules
+$wgResourceModules['skins.vector.styles'] = array(
+ 'styles' => array(
+ 'screen.less' => array( 'media' => 'screen' ),
+ 'screen-hd.less' => array( 'media' => 'screen and (min-width: 982px)' ),
+ ),
+ 'remoteSkinPath' => 'Vector',
+ 'localBasePath' => __DIR__,
+);
+$wgResourceModules['skins.vector.js'] = array(
+ 'scripts' => array(
+ 'collapsibleTabs.js',
+ 'vector.js',
+ ),
+ 'position' => 'top',
+ 'dependencies' => array(
+ 'jquery.throttle-debounce',
+ 'jquery.tabIndex',
+ ),
+ 'remoteSkinPath' => 'Vector',
+ 'localBasePath' => __DIR__,
+);
--- /dev/null
+<?php
+/**
+ * Vector - Modern version of MonoBook with fresh look and many usability
+ * improvements.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Skins
+ */
+
+/**
+ * QuickTemplate class for Vector skin
+ * @ingroup Skins
+ */
+class VectorTemplate extends BaseTemplate {
+ /* Functions */
+
+ /**
+ * Outputs the entire contents of the (X)HTML page
+ */
+ public function execute() {
+ global $wgVectorUseIconWatch;
+
+ // Build additional attributes for navigation urls
+ $nav = $this->data['content_navigation'];
+
+ if ( $wgVectorUseIconWatch ) {
+ $mode = $this->getSkin()->getUser()->isWatched( $this->getSkin()->getRelevantTitle() )
+ ? 'unwatch'
+ : 'watch';
+
+ if ( isset( $nav['actions'][$mode] ) ) {
+ $nav['views'][$mode] = $nav['actions'][$mode];
+ $nav['views'][$mode]['class'] = rtrim( 'icon ' . $nav['views'][$mode]['class'], ' ' );
+ $nav['views'][$mode]['primary'] = true;
+ unset( $nav['actions'][$mode] );
+ }
+ }
+
+ $xmlID = '';
+ foreach ( $nav as $section => $links ) {
+ foreach ( $links as $key => $link ) {
+ if ( $section == 'views' && !( isset( $link['primary'] ) && $link['primary'] ) ) {
+ $link['class'] = rtrim( 'collapsible ' . $link['class'], ' ' );
+ }
+
+ $xmlID = isset( $link['id'] ) ? $link['id'] : 'ca-' . $xmlID;
+ $nav[$section][$key]['attributes'] =
+ ' id="' . Sanitizer::escapeId( $xmlID ) . '"';
+ if ( $link['class'] ) {
+ $nav[$section][$key]['attributes'] .=
+ ' class="' . htmlspecialchars( $link['class'] ) . '"';
+ unset( $nav[$section][$key]['class'] );
+ }
+ if ( isset( $link['tooltiponly'] ) && $link['tooltiponly'] ) {
+ $nav[$section][$key]['key'] =
+ Linker::tooltip( $xmlID );
+ } else {
+ $nav[$section][$key]['key'] =
+ Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( $xmlID ) );
+ }
+ }
+ }
+ $this->data['namespace_urls'] = $nav['namespaces'];
+ $this->data['view_urls'] = $nav['views'];
+ $this->data['action_urls'] = $nav['actions'];
+ $this->data['variant_urls'] = $nav['variants'];
+
+ // Reverse horizontally rendered navigation elements
+ if ( $this->data['rtl'] ) {
+ $this->data['view_urls'] =
+ array_reverse( $this->data['view_urls'] );
+ $this->data['namespace_urls'] =
+ array_reverse( $this->data['namespace_urls'] );
+ $this->data['personal_urls'] =
+ array_reverse( $this->data['personal_urls'] );
+ }
+ // Output HTML Page
+ $this->html( 'headelement' );
+ ?>
+ <div id="mw-page-base" class="noprint"></div>
+ <div id="mw-head-base" class="noprint"></div>
+ <div id="content" class="mw-body" role="main">
+ <a id="top"></a>
+
+ <div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
+ <?php
+ if ( $this->data['sitenotice'] ) {
+ ?>
+ <div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
+ <?php
+ }
+ ?>
+ <h1 id="firstHeading" class="firstHeading" lang="<?php
+ $this->data['pageLanguage'] =
+ $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+ $this->text( 'pageLanguage' );
+ ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
+ <?php $this->html( 'prebodyhtml' ) ?>
+ <div id="bodyContent" class="mw-body-content">
+ <?php
+ if ( $this->data['isarticle'] ) {
+ ?>
+ <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+ <?php
+ }
+ ?>
+ <div id="contentSub"<?php
+ $this->html( 'userlangattributes' )
+ ?>><?php $this->html( 'subtitle' ) ?></div>
+ <?php
+ if ( $this->data['undelete'] ) {
+ ?>
+ <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
+ <?php
+ }
+ ?>
+ <?php
+ if ( $this->data['newtalk'] ) {
+ ?>
+ <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
+ <?php
+ }
+ ?>
+ <div id="jump-to-nav" class="mw-jump">
+ <?php $this->msg( 'jumpto' ) ?>
+ <a href="#mw-navigation"><?php
+ $this->msg( 'jumptonavigation' )
+ ?></a><?php
+ $this->msg( 'comma-separator' )
+ ?>
+ <a href="#p-search"><?php $this->msg( 'jumptosearch' ) ?></a>
+ </div>
+ <?php $this->html( 'bodycontent' ) ?>
+ <?php
+ if ( $this->data['printfooter'] ) {
+ ?>
+ <div class="printfooter">
+ <?php $this->html( 'printfooter' ); ?>
+ </div>
+ <?php
+ }
+ ?>
+ <?php
+ if ( $this->data['catlinks'] ) {
+ ?>
+ <?php
+ $this->html( 'catlinks' );
+ ?>
+ <?php
+ }
+ ?>
+ <?php
+ if ( $this->data['dataAfterContent'] ) {
+ ?>
+ <?php
+ $this->html( 'dataAfterContent' );
+ ?>
+ <?php
+ }
+ ?>
+ <div class="visualClear"></div>
+ <?php $this->html( 'debughtml' ); ?>
+ </div>
+ </div>
+ <div id="mw-navigation">
+ <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
+
+ <div id="mw-head">
+ <?php $this->renderNavigation( 'PERSONAL' ); ?>
+ <div id="left-navigation">
+ <?php $this->renderNavigation( array( 'NAMESPACES', 'VARIANTS' ) ); ?>
+ </div>
+ <div id="right-navigation">
+ <?php $this->renderNavigation( array( 'VIEWS', 'ACTIONS', 'SEARCH' ) ); ?>
+ </div>
+ </div>
+ <div id="mw-panel">
+ <div id="p-logo" role="banner"><a style="background-image: url(<?php
+ $this->text( 'logopath' )
+ ?>);" href="<?php
+ echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] )
+ ?>" <?php
+ echo Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) )
+ ?>></a></div>
+ <?php $this->renderPortals( $this->data['sidebar'] ); ?>
+ </div>
+ </div>
+ <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
+ <?php
+ foreach ( $this->getFooterLinks() as $category => $links ) {
+ ?>
+ <ul id="footer-<?php
+ echo $category
+ ?>">
+ <?php
+ foreach ( $links as $link ) {
+ ?>
+ <li id="footer-<?php
+ echo $category
+ ?>-<?php
+ echo $link
+ ?>"><?php
+ $this->html( $link )
+ ?></li>
+ <?php
+ }
+ ?>
+ </ul>
+ <?php
+ }
+ ?>
+ <?php $footericons = $this->getFooterIcons( "icononly" );
+ if ( count( $footericons ) > 0 ) {
+ ?>
+ <ul id="footer-icons" class="noprint">
+ <?php
+ foreach ( $footericons as $blockName => $footerIcons ) {
+ ?>
+ <li id="footer-<?php
+ echo htmlspecialchars( $blockName ); ?>ico">
+ <?php
+ foreach ( $footerIcons as $icon ) {
+ ?>
+ <?php
+ echo $this->getSkin()->makeFooterIcon( $icon );
+ ?>
+
+ <?php
+ }
+ ?>
+ </li>
+ <?php
+ }
+ ?>
+ </ul>
+ <?php
+ }
+ ?>
+ <div style="clear:both"></div>
+ </div>
+ <?php $this->printTrail(); ?>
+
+ </body>
+</html>
+ <?php
+ }
+
+ /**
+ * Render a series of portals
+ *
+ * @param array $portals
+ */
+ protected function renderPortals( $portals ) {
+ // Force the rendering of the following portals
+ if ( !isset( $portals['SEARCH'] ) ) {
+ $portals['SEARCH'] = true;
+ }
+ if ( !isset( $portals['TOOLBOX'] ) ) {
+ $portals['TOOLBOX'] = true;
+ }
+ if ( !isset( $portals['LANGUAGES'] ) ) {
+ $portals['LANGUAGES'] = true;
+ }
+ // Render portals
+ foreach ( $portals as $name => $content ) {
+ if ( $content === false ) {
+ continue;
+ }
+
+ switch ( $name ) {
+ case 'SEARCH':
+ break;
+ case 'TOOLBOX':
+ $this->renderPortal( 'tb', $this->getToolbox(), 'toolbox', 'SkinTemplateToolboxEnd' );
+ break;
+ case 'LANGUAGES':
+ if ( $this->data['language_urls'] !== false ) {
+ $this->renderPortal( 'lang', $this->data['language_urls'], 'otherlanguages' );
+ }
+ break;
+ default:
+ $this->renderPortal( $name, $content );
+ break;
+ }
+ }
+ }
+
+ /**
+ * @param string $name
+ * @param array $content
+ * @param null|string $msg
+ * @param null|string|array $hook
+ */
+ protected function renderPortal( $name, $content, $msg = null, $hook = null ) {
+ if ( $msg === null ) {
+ $msg = $name;
+ }
+ $msgObj = wfMessage( $msg );
+ ?>
+ <div class="portal" role="navigation" id='<?php
+ echo Sanitizer::escapeId( "p-$name" )
+ ?>'<?php
+ echo Linker::tooltip( 'p-' . $name )
+ ?> aria-labelledby='<?php echo Sanitizer::escapeId( "p-$name-label" ) ?>'>
+ <h3<?php
+ $this->html( 'userlangattributes' )
+ ?> id='<?php
+ echo Sanitizer::escapeId( "p-$name-label" )
+ ?>'><?php
+ echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg );
+ ?></h3>
+
+ <div class="body">
+ <?php
+ if ( is_array( $content ) ) {
+ ?>
+ <ul>
+ <?php
+ foreach ( $content as $key => $val ) {
+ ?>
+ <?php echo $this->makeListItem( $key, $val ); ?>
+
+ <?php
+ }
+ if ( $hook !== null ) {
+ wfRunHooks( $hook, array( &$this, true ) );
+ }
+ ?>
+ </ul>
+ <?php
+ } else {
+ ?>
+ <?php
+ echo $content; /* Allow raw HTML block to be defined by extensions */
+ }
+
+ $this->renderAfterPortlet( $name );
+ ?>
+ </div>
+ </div>
+ <?php
+ }
+
+ /**
+ * Render one or more navigations elements by name, automatically reveresed
+ * when UI is in RTL mode
+ *
+ * @param array $elements
+ */
+ protected function renderNavigation( $elements ) {
+ global $wgVectorUseSimpleSearch;
+
+ // If only one element was given, wrap it in an array, allowing more
+ // flexible arguments
+ if ( !is_array( $elements ) ) {
+ $elements = array( $elements );
+ // If there's a series of elements, reverse them when in RTL mode
+ } elseif ( $this->data['rtl'] ) {
+ $elements = array_reverse( $elements );
+ }
+ // Render elements
+ foreach ( $elements as $name => $element ) {
+ switch ( $element ) {
+ case 'NAMESPACES':
+ ?>
+ <div id="p-namespaces" role="navigation" class="vectorTabs<?php
+ if ( count( $this->data['namespace_urls'] ) == 0 ) {
+ echo ' emptyPortlet';
+ }
+ ?>" aria-labelledby="p-namespaces-label">
+ <h3 id="p-namespaces-label"><?php $this->msg( 'namespaces' ) ?></h3>
+ <ul<?php $this->html( 'userlangattributes' ) ?>>
+ <?php
+ foreach ( $this->data['namespace_urls'] as $link ) {
+ ?>
+ <li <?php
+ echo $link['attributes']
+ ?>><span><a href="<?php
+ echo htmlspecialchars( $link['href'] )
+ ?>" <?php
+ echo $link['key']
+ ?>><?php
+ echo htmlspecialchars( $link['text'] )
+ ?></a></span></li>
+ <?php
+ }
+ ?>
+ </ul>
+ </div>
+ <?php
+ break;
+ case 'VARIANTS':
+ ?>
+ <div id="p-variants" role="navigation" class="vectorMenu<?php
+ if ( count( $this->data['variant_urls'] ) == 0 ) {
+ echo ' emptyPortlet';
+ }
+ ?>" aria-labelledby="p-variants-label">
+ <h3 id="mw-vector-current-variant">
+ <?php
+ foreach ( $this->data['variant_urls'] as $link ) {
+ ?>
+ <?php
+ if ( stripos( $link['attributes'], 'selected' ) !== false ) {
+ ?>
+ <?php
+ echo htmlspecialchars( $link['text'] )
+ ?>
+ <?php
+ }
+ ?>
+ <?php
+ }
+ ?>
+ </h3>
+
+ <h3 id="p-variants-label"><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h3>
+
+ <div class="menu">
+ <ul>
+ <?php
+ foreach ( $this->data['variant_urls'] as $link ) {
+ ?>
+ <li<?php
+ echo $link['attributes']
+ ?>><a href="<?php
+ echo htmlspecialchars( $link['href'] )
+ ?>" lang="<?php
+ echo htmlspecialchars( $link['lang'] )
+ ?>" hreflang="<?php
+ echo htmlspecialchars( $link['hreflang'] )
+ ?>" <?php
+ echo $link['key']
+ ?>><?php
+ echo htmlspecialchars( $link['text'] )
+ ?></a></li>
+ <?php
+ }
+ ?>
+ </ul>
+ </div>
+ </div>
+ <?php
+ break;
+ case 'VIEWS':
+ ?>
+ <div id="p-views" role="navigation" class="vectorTabs<?php
+ if ( count( $this->data['view_urls'] ) == 0 ) {
+ echo ' emptyPortlet';
+ }
+ ?>" aria-labelledby="p-views-label">
+ <h3 id="p-views-label"><?php $this->msg( 'views' ) ?></h3>
+ <ul<?php
+ $this->html( 'userlangattributes' )
+ ?>>
+ <?php
+ foreach ( $this->data['view_urls'] as $link ) {
+ ?>
+ <li<?php
+ echo $link['attributes']
+ ?>><span><a href="<?php
+ echo htmlspecialchars( $link['href'] )
+ ?>" <?php
+ echo $link['key']
+ ?>><?php
+ // $link['text'] can be undefined - bug 27764
+ if ( array_key_exists( 'text', $link ) ) {
+ echo array_key_exists( 'img', $link )
+ ? '<img src="' . $link['img'] . '" alt="' . $link['text'] . '" />'
+ : htmlspecialchars( $link['text'] );
+ }
+ ?></a></span></li>
+ <?php
+ }
+ ?>
+ </ul>
+ </div>
+ <?php
+ break;
+ case 'ACTIONS':
+ ?>
+ <div id="p-cactions" role="navigation" class="vectorMenu<?php
+ if ( count( $this->data['action_urls'] ) == 0 ) {
+ echo ' emptyPortlet';
+ }
+ ?>" aria-labelledby="p-cactions-label">
+ <h3 id="p-cactions-label"><span><?php $this->msg( 'vector-more-actions' ) ?></span><a href="#"></a></h3>
+
+ <div class="menu">
+ <ul<?php $this->html( 'userlangattributes' ) ?>>
+ <?php
+ foreach ( $this->data['action_urls'] as $link ) {
+ ?>
+ <li<?php
+ echo $link['attributes']
+ ?>>
+ <a href="<?php
+ echo htmlspecialchars( $link['href'] )
+ ?>" <?php
+ echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] )
+ ?></a>
+ </li>
+ <?php
+ }
+ ?>
+ </ul>
+ </div>
+ </div>
+ <?php
+ break;
+ case 'PERSONAL':
+ ?>
+ <div id="p-personal" role="navigation" class="<?php
+ if ( count( $this->data['personal_urls'] ) == 0 ) {
+ echo ' emptyPortlet';
+ }
+ ?>" aria-labelledby="p-personal-label">
+ <h3 id="p-personal-label"><?php $this->msg( 'personaltools' ) ?></h3>
+ <ul<?php $this->html( 'userlangattributes' ) ?>>
+ <?php
+ $personalTools = $this->getPersonalTools();
+ foreach ( $personalTools as $key => $item ) {
+ echo $this->makeListItem( $key, $item );
+ }
+ ?>
+ </ul>
+ </div>
+ <?php
+ break;
+ case 'SEARCH':
+ ?>
+ <div id="p-search" role="search">
+ <h3<?php $this->html( 'userlangattributes' ) ?>>
+ <label for="searchInput"><?php $this->msg( 'search' ) ?></label>
+ </h3>
+
+ <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
+ <?php
+ if ($wgVectorUseSimpleSearch) {
+ ?>
+ <div id="simpleSearch">
+ <?php
+ } else {
+ ?>
+ <div>
+ <?php
+ }
+ ?>
+ <?php
+ echo $this->makeSearchInput( array( 'id' => 'searchInput' ) );
+ echo Html::hidden( 'title', $this->get( 'searchtitle' ) );
+ // We construct two buttons (for 'go' and 'fulltext' search modes),
+ // but only one will be visible and actionable at a time (they are
+ // overlaid on top of each other in CSS).
+ // * Browsers will use the 'fulltext' one by default (as it's the
+ // first in tree-order), which is desirable when they are unable
+ // to show search suggestions (either due to being broken or
+ // having JavaScript turned off).
+ // * The mediawiki.searchSuggest module, after doing tests for the
+ // broken browsers, removes the 'fulltext' button and handles
+ // 'fulltext' search itself; this will reveal the 'go' button and
+ // cause it to be used.
+ echo $this->makeSearchButton(
+ 'fulltext',
+ array( 'id' => 'mw-searchButton', 'class' => 'searchButton mw-fallbackSearchButton' )
+ );
+ echo $this->makeSearchButton(
+ 'go',
+ array( 'id' => 'searchButton', 'class' => 'searchButton' )
+ );
+ ?>
+ </div>
+ </form>
+ </div>
+ <?php
+
+ break;
+ }
+ }
+ }
+}
--- /dev/null
+/**
+ * Collapsible tabs jQuery Plugin
+ */
+( function ( $ ) {
+ var rtl = $( 'html' ).attr( 'dir' ) === 'rtl';
+ $.fn.collapsibleTabs = function ( options ) {
+ // return if the function is called on an empty jquery object
+ if ( !this.length ) {
+ return this;
+ }
+ // Merge options into the defaults
+ var settings = $.extend( {}, $.collapsibleTabs.defaults, options );
+
+ this.each( function () {
+ var $el = $( this );
+ // add the element to our array of collapsible managers
+ $.collapsibleTabs.instances = ( $.collapsibleTabs.instances.length === 0 ?
+ $el : $.collapsibleTabs.instances.add( $el ) );
+ // attach the settings to the elements
+ $el.data( 'collapsibleTabsSettings', settings );
+ // attach data to our collapsible elements
+ $el.children( settings.collapsible ).each( function () {
+ $.collapsibleTabs.addData( $( this ) );
+ } );
+ } );
+
+ // if we haven't already bound our resize handler, bind it now
+ if ( !$.collapsibleTabs.boundEvent ) {
+ $( window ).on( 'resize', $.debounce( 500, function () {
+ $.collapsibleTabs.handleResize();
+ } ) );
+ $.collapsibleTabs.boundEvent = true;
+ }
+
+ // call our resize handler to setup the page
+ $.collapsibleTabs.handleResize();
+ return this;
+ };
+ $.collapsibleTabs = {
+ instances: [],
+ boundEvent: null,
+ defaults: {
+ expandedContainer: '#p-views ul',
+ collapsedContainer: '#p-cactions ul',
+ collapsible: 'li.collapsible',
+ shifting: false,
+ expandCondition: function ( eleWidth ) {
+ // If there are at least eleWidth + 1 pixels of free space, expand.
+ // We add 1 because .width() will truncate fractional values but .offset() will not.
+ return $.collapsibleTabs.calculateTabDistance() >= eleWidth + 1;
+ },
+ collapseCondition: function () {
+ // If there's an overlap, collapse.
+ return $.collapsibleTabs.calculateTabDistance() < 0;
+ }
+ },
+ addData: function ( $collapsible ) {
+ var settings = $collapsible.parent().data( 'collapsibleTabsSettings' );
+ if ( settings ) {
+ $collapsible.data( 'collapsibleTabsSettings', {
+ expandedContainer: settings.expandedContainer,
+ collapsedContainer: settings.collapsedContainer,
+ expandedWidth: $collapsible.width(),
+ prevElement: $collapsible.prev()
+ } );
+ }
+ },
+ getSettings: function ( $collapsible ) {
+ var settings = $collapsible.data( 'collapsibleTabsSettings' );
+ if ( !settings ) {
+ $.collapsibleTabs.addData( $collapsible );
+ settings = $collapsible.data( 'collapsibleTabsSettings' );
+ }
+ return settings;
+ },
+ handleResize: function () {
+ $.collapsibleTabs.instances.each( function () {
+ var $el = $( this ),
+ data = $.collapsibleTabs.getSettings( $el );
+
+ if ( data.shifting ) {
+ return;
+ }
+
+ // if the two navigations are colliding
+ if ( $el.children( data.collapsible ).length > 0 && data.collapseCondition() ) {
+
+ $el.trigger( 'beforeTabCollapse' );
+ // move the element to the dropdown menu
+ $.collapsibleTabs.moveToCollapsed( $el.children( data.collapsible + ':last' ) );
+ }
+
+ // if there are still moveable items in the dropdown menu,
+ // and there is sufficient space to place them in the tab container
+ if ( $( data.collapsedContainer + ' ' + data.collapsible ).length > 0 &&
+ data.expandCondition( $.collapsibleTabs.getSettings( $( data.collapsedContainer ).children(
+ data.collapsible + ':first' ) ).expandedWidth ) ) {
+ //move the element from the dropdown to the tab
+ $el.trigger( 'beforeTabExpand' );
+ $.collapsibleTabs
+ .moveToExpanded( data.collapsedContainer + ' ' + data.collapsible + ':first' );
+ }
+ } );
+ },
+ moveToCollapsed: function ( ele ) {
+ var outerData, expContainerSettings, target,
+ $moving = $( ele );
+
+ outerData = $.collapsibleTabs.getSettings( $moving );
+ if ( !outerData ) {
+ return;
+ }
+ expContainerSettings = $.collapsibleTabs.getSettings( $( outerData.expandedContainer ) );
+ if ( !expContainerSettings ) {
+ return;
+ }
+ expContainerSettings.shifting = true;
+
+ // Remove the element from where it's at and put it in the dropdown menu
+ target = outerData.collapsedContainer;
+ $moving.css( 'position', 'relative' )
+ .css( ( rtl ? 'left' : 'right' ), 0 )
+ .animate( { width: '1px' }, 'normal', function () {
+ var data, expContainerSettings;
+ $( this ).hide();
+ // add the placeholder
+ $( '<span class="placeholder" style="display: none;"></span>' ).insertAfter( this );
+ $( this ).detach().prependTo( target ).data( 'collapsibleTabsSettings', outerData );
+ $( this ).attr( 'style', 'display: list-item;' );
+ data = $.collapsibleTabs.getSettings( $( ele ) );
+ if ( data ) {
+ expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+ if ( expContainerSettings ) {
+ expContainerSettings.shifting = false;
+ $.collapsibleTabs.handleResize();
+ }
+ }
+ } );
+ },
+ moveToExpanded: function ( ele ) {
+ var data, expContainerSettings, $target, expandedWidth,
+ $moving = $( ele );
+
+ data = $.collapsibleTabs.getSettings( $moving );
+ if ( !data ) {
+ return;
+ }
+ expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+ if ( !expContainerSettings ) {
+ return;
+ }
+ expContainerSettings.shifting = true;
+
+ // grab the next appearing placeholder so we can use it for replacing
+ $target = $( data.expandedContainer ).find( 'span.placeholder:first' );
+ expandedWidth = data.expandedWidth;
+ $moving.css( 'position', 'relative' ).css( ( rtl ? 'right' : 'left' ), 0 ).css( 'width', '1px' );
+ $target.replaceWith(
+ $moving
+ .detach()
+ .css( 'width', '1px' )
+ .data( 'collapsibleTabsSettings', data )
+ .animate( { width: expandedWidth + 'px' }, 'normal', function () {
+ $( this ).attr( 'style', 'display: block;' );
+ var data, expContainerSettings;
+ data = $.collapsibleTabs.getSettings( $( this ) );
+ if ( data ) {
+ expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+ if ( expContainerSettings ) {
+ expContainerSettings.shifting = false;
+ $.collapsibleTabs.handleResize();
+ }
+ }
+ } )
+ );
+ },
+ /**
+ * Returns the amount of horizontal distance between the two tabs groups
+ * (#left-navigation and #right-navigation), in pixels. If negative, this
+ * means that the tabs overlap, and the value is the width of overlapping
+ * parts.
+ *
+ * Used in default expandCondition and collapseCondition.
+ *
+ * @return {Numeric} distance/overlap in pixels
+ */
+ calculateTabDistance: function () {
+ var $leftTab, $rightTab, leftEnd, rightStart;
+
+ // In RTL, #right-navigation is actually on the left and vice versa.
+ // Hooray for descriptive naming.
+ if ( !rtl ) {
+ $leftTab = $( '#left-navigation' );
+ $rightTab = $( '#right-navigation' );
+ } else {
+ $leftTab = $( '#right-navigation' );
+ $rightTab = $( '#left-navigation' );
+ }
+
+ leftEnd = $leftTab.offset().left + $leftTab.width();
+ rightStart = $rightTab.offset().left;
+
+ return rightStart - leftEnd;
+ }
+ };
+
+}( jQuery ) );
--- /dev/null
+/* Animate between standard and high definition layouts */
+body.vector-animateLayout {
+ div#content,
+ div#footer,
+ #left-navigation {
+ .transition(margin-left 250ms, padding 250ms;);
+ }
+
+ #p-logo {
+ .transition(left 250ms);
+ }
+
+ #mw-panel {
+ .transition(padding-right 250ms);
+ }
+
+ #p-search {
+ .transition(margin-right 250ms);
+ }
+
+ #p-personal {
+ .transition(right 250ms);
+ }
+
+ #mw-head-base {
+ .transition(margin-left 250ms);
+ }
+}
--- /dev/null
+/*
+ * Any rules which should not be flipped automatically in right-to-left situations should be
+ * prepended with @noflip in a comment block.
+ *
+ * This stylesheet employs a few CSS trick to accomplish compatibility with a wide range of web
+ * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
+ * a rule that makes things work in IE6, and then following it with a rule that begins with
+ * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support
+ * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and
+ * "IGNORED BY IE6" comments.
+ */
+@import "mediawiki.mixins";
+
+/* Framework */
+html {
+ font-size: @html-font-size;
+}
+html,
+body {
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ font-family: @content-font-family;
+}
+body {
+ background-color: @menu-background-color;
+}
+
+/* Content */
+div#content {
+ margin-left: 10em;
+ padding: @content-padding;
+ /* Border on top, left, and bottom side */
+ border: 1px solid @content-border-color;
+ border-right-width: 0;
+ /* Merge the border with tabs' one (in their background image) */
+ margin-top: -1px;
+ background-color: @body-background-color;
+ color: @content-font-color;
+ direction: ltr;
+
+ .mw-editsection,
+ .mw-editsection-like {
+ font-family: @content-font-family;
+ }
+
+ p {
+ line-height: inherit;
+ margin: 0.5em 0;
+ }
+
+ h1,
+ h2,
+ #firstHeading {
+ font-family: @content-heading-font-family;
+ line-height: @heading-line-height;
+ margin-bottom: 0.25em;
+ padding: 0;
+ }
+
+ h1,
+ #firstHeading {
+ font-size: @content-heading-font-size;
+ }
+
+ h2 {
+ font-size: 1.5em;
+ margin-top: 1em;
+ }
+
+ h3,
+ h4,
+ h5,
+ h6 {
+ line-height: @content-line-height;
+ margin-top: 0.3em;
+ margin-bottom: 0;
+ padding-bottom: 0;
+ }
+
+ h3 {
+ font-size: 1.17em;
+ }
+
+ h3,
+ h4 {
+ font-weight: bold;
+ }
+
+ h4,
+ h5,
+ h6 {
+ font-size: 100%; /* (reset) */
+ }
+
+ #toc h2,
+ .toc h2 {
+ font-size: 100%; /* (reset) */
+ font-family: @content-font-family;
+ }
+}
+
+/* Hide empty portlets */
+div.emptyPortlet {
+ display: none;
+}
+
+ul {
+ list-style-type: disc;
+ .list-style-image('images/bullet-icon.png');
+}
+
+pre, .mw-code {
+ line-height: 1.3em;
+}
+
+/* Site Notice (includes notices from CentralNotice extension) */
+#siteNotice {
+ font-size: 0.8em;
+}
+
+.redirectText {
+ font-size: 140%;
+}
+
+.redirectMsg img {
+ vertical-align: text-bottom;
+}
+
+/* TODO: Remove #bodyContent selector (kept for backwards compatibility with cached html) */
+#bodyContent,
+.mw-body-content {
+ position: relative;
+ line-height: @content-line-height;
+ font-size: @content-font-size;
+}
+
+/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
+// FIXME: Should be part of jquery.tipsy.css
+.tipsy {
+ font-size: 0.8em;
+}
--- /dev/null
+@import "mediawiki.mixins.less";
+// External links
+#content {
+ .external {
+ background-position: center right;
+ background-repeat: no-repeat;
+ .background-image-svg('images/external-link-ltr-icon.svg', 'images/external-link-ltr-icon.png');
+ padding-right: 13px;
+ }
+}
--- /dev/null
+/* Footer */
+div#footer {
+ margin-left: 10em;
+ margin-top: 0;
+ padding: 0.75em;
+ direction: ltr;
+
+ ul {
+ list-style-type: none;
+ list-style-image: none;
+ margin: 0;
+ padding: 0;
+
+ li {
+ margin: 0;
+ padding: 0;
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ color: #333;
+ font-size: 0.7em;
+ }
+ }
+
+ #footer-icons {
+ float: right;
+
+ li {
+ float: left;
+ margin-left: 0.5em;
+ line-height: 2em;
+ text-align: right;
+ }
+ }
+
+ #footer-info {
+ li {
+ line-height: 1.4em;
+ }
+ }
+
+ #footer-places {
+ li {
+ float: left;
+ margin-right: 1em;
+ line-height: 2em;
+ }
+ }
+}
+
+body.ltr {
+ div#footer {
+ #footer-places {
+ /* @noflip */
+ float: left;
+ }
+ }
+}
--- /dev/null
+@import "mediawiki.mixins";
+@import "personalMenu";
+@import "search";
+@import "tabs";
+
+/* Hide, but keep accessible for screen-readers */
+#mw-navigation h2 {
+ position: absolute;
+ top: -9999px;
+}
+
+/* Head */
+#mw-page-base {
+ height: 5em;
+ background-position: bottom left;
+ background-repeat: repeat-x;
+ /* This image is only a fallback (for IE 6-9), so we do not @embed it. */
+ background-image: url('images/page-fade.png');
+ .vertical-gradient(@body-background-color, @menu-background-color, 50%, 100%);
+ background-color: @body-background-color;
+}
+
+#mw-head-base {
+ margin-top: -5em;
+ margin-left: 10em;
+ height: 5em;
+}
+
+div#mw-head {
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 100%;
+
+ h3 {
+ margin: 0;
+ padding: 0;
+ }
+}
+
+/* Navigation Containers */
+#left-navigation {
+ float: left;
+ margin-left: 10em;
+ margin-top: 2.5em;
+ /* When right nav would overlap left nav, it's placed below it
+ (normal CSS floats behavior). This rule ensures that no empty space
+ is shown between them due to right nav's margin-top. Page layout
+ is still broken, but at least the nav overlaps only the page title
+ instead of half the content. */
+ margin-bottom: -2.5em;
+ /* IE 6 double-margin bug fix */
+ display: inline;
+}
+
+#right-navigation {
+ float: right;
+ margin-top: 2.5em;
+}
+
+/* Logo */
+#p-logo {
+ position: absolute;
+ top: -160px;
+ left: 0;
+ width: 10em;
+ height: 160px;
+
+ a {
+ display: block;
+ width: 10em;
+ height: 160px;
+ background-repeat: no-repeat;
+ background-position: center center;
+ text-decoration: none;
+ }
+}
+
+/* Panel */
+div#mw-panel {
+ font-size: @menu-main-font-size;
+ position: absolute;
+ top: 160px;
+ padding-top: 1em;
+ width: 10em;
+ left: 0;
+
+ div.portal {
+ margin: 0 0.6em 0 0.7em;
+ padding: 0.25em 0;
+ direction: ltr;
+ background-position: top left;
+ background-repeat: no-repeat;
+ .background-image('images/portal-break.png');
+
+ h3 {
+ font-size: @menu-main-heading-font-size;
+ color: @menu-main-heading-color;
+ font-weight: normal;
+ margin: 0;
+ padding: @menu-main-heading-padding;
+ cursor: default;
+ border: none;
+ }
+
+ div.body {
+ margin: @menu-main-body-margin;
+ padding-top: 0;
+
+ ul {
+ list-style-type: none;
+ list-style-image: none;
+ margin: 0;
+ padding: @menu-main-body-padding;
+
+ li {
+ line-height: 1.125em;
+ margin: 0;
+ padding: 0.25em 0;
+ font-size: @menu-main-body-font-size;
+ word-wrap: break-word;
+
+ a {
+ color: @menu-main-body-link-color;
+ &:visited {
+ color: @menu-main-body-link-visited-color;
+ }
+ }
+ }
+ }
+ }
+
+ &.first {
+ background-image: none;
+ margin-top: 0;
+ h3 {
+ display: none;
+ }
+ div.body {
+ margin-left: 0.5em;
+ }
+ }
+ }
+}
--- /dev/null
+/* mediawiki.notification */
+.skin-vector {
+ .mw-notification-area {
+ font-size: 0.8em;
+ }
+
+ .mw-notification-area-layout {
+ top: 7em;
+ }
+
+ .mw-notification {
+ background-color: #fff;
+ background-color: rgba(255, 255, 255, 0.93);
+ padding: 0.75em 1.5em;
+ border: solid 1px @content-border-color;
+ border-radius: 0.75em;
+ box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
+ }
+}
--- /dev/null
+/* Personal */
+#p-personal {
+ position: absolute;
+ top: 0.33em;
+ right: 0.75em;
+ /* Display on top of page tabs - bugs 37158, 48078 */
+ z-index: 100;
+
+ h3 {
+ display: none;
+ }
+
+ ul {
+ list-style-type: none;
+ list-style-image: none;
+ margin: 0;
+ padding-left: 10em; /* Keep from overlapping logo */
+ }
+
+ li {
+ line-height: 1.125em;
+ /* @noflip */
+ float: left;
+ margin-left: 0.75em;
+ margin-top: 0.5em;
+ font-size: @menu-personal-font-size;
+ white-space: nowrap;
+ }
+}
+
+/* Icon for Usernames */
+#pt-userpage,
+#pt-anonuserpage,
+#pt-login {
+ background-position: left top;
+ background-repeat: no-repeat;
+ /* SVG support using a transparent gradient to guarantee cross-browser
+ * compatibility (browsers able to understand gradient syntax support also SVG) */
+ .background-image-svg('images/user-icon.svg', 'images/user-icon.png');
+ padding-left: 15px !important;
+}
--- /dev/null
+/* Search */
+#p-search {
+ /* @noflip */
+ float: left;
+ margin-right: 0.5em;
+ margin-left: 0.5em;
+
+ h3 {
+ display: none;
+ }
+
+ form,
+ input {
+ margin: 0;
+ margin-top: 0.4em;
+ }
+}
+
+div#simpleSearch {
+ display: block;
+ width: 14em;
+ height: 1.4em;
+ margin-top: 0.65em;
+ position: relative;
+ min-height: 1px; /* Gotta trigger hasLayout for IE7 */
+ border: solid 1px #aaa;
+ color: black;
+ background-color: white;
+ .background-image('images/search-fade.png');
+ background-position: top left;
+ background-repeat: repeat-x;
+
+ // Styles for both the search input and the button
+ input {
+ position: absolute;
+ margin: 0;
+ padding: 0;
+ border: 0;
+ background-color: transparent;
+ color: black;
+ }
+
+ // The search input
+ #searchInput {
+ top: 0;
+ left: 0;
+ width: 90%;
+ padding: 0.2em 0 0.2em 0.2em;
+ font-size: 13px;
+ direction: ltr;
+
+ &:focus {
+ outline: none;
+ }
+
+ // These rules MAY NOT be merged because of how CSS requires browsers
+ // to parse unrecognized selectors!
+ // Note these rules ensure that placeholder text can be distinguished from
+ // standard text. In browsers which make this distinction clear these rules
+ // are not necessary.
+ // For inputs that use jquery.placeholder.js e.g. IE9-
+ &.placeholder {
+ color: #999;
+ }
+ // Distinguish placeholder text in IE10+
+ &:-ms-input-placeholder {
+ color: #999;
+ }
+ // Distinguish placeholder text in Firefox 18-
+ &:-moz-placeholder {
+ color: #999;
+ }
+
+ // Undo the styles Webkit browsers apply to type=search fields,
+ // we provide our own
+ -webkit-appearance: textfield;
+
+ &::-webkit-search-decoration,
+ &::-webkit-search-cancel-button,
+ &::-webkit-search-results-button,
+ &::-webkit-search-results-decoration {
+ -webkit-appearance: textfield;
+ }
+ }
+
+ // The buttons. They are displayed in the same position, and if both are
+ // present the fulltext search one obscures the 'Go' one.
+ #searchButton,
+ #mw-searchButton {
+ top: 0;
+ right: 0;
+ width: 10%;
+ height: 100%;
+ cursor: pointer;
+ /* Hide button text and replace it with the image. */
+ /* This would be 100% if not for Firefox shenanigans (bug 60900). */
+ text-indent: 200%;
+ /* Needed to make IE6 respect the text-indent. */
+ line-height: 1;
+ /* Opera 12 on RTL flips the text in a funny way without this. */
+ /* @noflip */
+ direction: ltr;
+ white-space: nowrap;
+ overflow: hidden;
+ .background-image-svg('images/search-ltr.svg', 'images/search-ltr.png');
+ background-position: center center;
+ background-repeat: no-repeat;
+ }
+
+ #mw-searchButton {
+ z-index: 1;
+ }
+}
--- /dev/null
+/*
+Styling for namespace tabs (page, discussion) and views (read, edit, view history, watch and other actions)
+*/
+
+/* Navigation Labels */
+div.vectorTabs h3 {
+ display: none;
+}
+
+/* Namespaces and Views */
+div.vectorTabs {
+ /* @noflip */
+ float: left;
+ height: 2.5em;
+ .background-image('images/tab-break.png');
+ background-position: bottom left;
+ background-repeat: no-repeat;
+ padding-left: 1px;
+
+ ul {
+ /* @noflip */
+ float: left;
+ height: 100%;
+ list-style-type: none;
+ list-style-image: none;
+ margin: 0;
+ padding: 0;
+ .background-image('images/tab-break.png');
+ background-position: right bottom;
+ background-repeat: no-repeat;
+
+ li {
+ /* @noflip */
+ float: left;
+ line-height: 1.125em;
+ /* For IE6, overridden later to display:block by modern browsers */
+ display: inline-block;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ background-color: #f3f3f3;
+ .background-image('images/tab-normal-fade.png');
+ background-position: bottom left;
+ background-repeat: repeat-x;
+ white-space: nowrap;
+ }
+
+ /* IGNORED BY IE6 which doesn't support child selector */
+ > li {
+ display: block;
+ }
+ }
+
+ li {
+ &.new {
+ a,
+ a:visited{
+ color: #a55858;
+ }
+ }
+
+ &.selected {
+ .background-image('images/tab-current-fade.png');
+ a,
+ a:visited{
+ color: #333;
+ text-decoration: none;
+ }
+ }
+
+ &.icon {
+ a {
+ background-position: bottom right;
+ background-repeat: no-repeat;
+ }
+ }
+
+ a {
+ /* For IE6, overridden later to display:block by modern browsers */
+ display: inline-block;
+ height: 1.9em;
+ padding-left: 0.5em;
+ padding-right: 0.5em;
+ color: @menu-link-color;
+ cursor: pointer;
+ font-size: 0.8em;
+ }
+
+ /* Ignored by IE6 which doesn't support child selector */
+ > a {
+ display: block;
+ }
+ }
+
+ span {
+ display: inline-block;
+ .background-image('images/tab-break.png');
+ background-position: bottom right;
+ background-repeat: no-repeat;
+
+ a {
+ /* For IE6, overridden later to display:block by modern browsers */
+ display: inline-block;
+ padding-top: 1.25em;
+ }
+
+ /* Ignored by IE6 which doesn't support child selector */
+ > a {
+ /* @noflip */
+ float: left;
+ display: block;
+ }
+ }
+}
+
+/* Variants and Actions */
+div.vectorMenu {
+ /* @noflip */
+ direction: ltr;
+ /* @noflip */
+ float: left;
+ cursor: pointer;
+ position: relative;
+}
+
+body.rtl div.vectorMenu {
+ /* @noflip */
+ direction: rtl;
+}
+
+div#mw-head div.vectorMenu h3 {
+ /* @noflip */
+ float: left;
+ .background-image('images/tab-break.png');
+ background-repeat: no-repeat;
+ background-position: bottom right;
+ margin-left: -1px;
+ font-size: 1em;
+ height: 2.5em;
+ // This effectively moves the "background border" outside of the element to act like a real
+ // border. It is necessary for the dropdown (div.vectorMenu div.menu) to align well.
+ padding-right: 1px;
+ margin-right: -1px;
+}
+
+// The "Variants" menu has a really funny structure
+div#mw-head div.vectorMenu#p-variants {
+ #p-variants-label span {
+ display: none;
+ }
+
+ #mw-vector-current-variant {
+ display: inline-block;
+ float: left;
+ padding-right: 20px;
+ font-size: 0.8em;
+ padding-left: 0.5em;
+ padding-top: 1.375em;
+ font-weight: normal;
+ border: none;
+ background-image: none;
+ }
+}
+
+div.vectorMenu h3 span {
+ display: block;
+ font-size: 0.8em;
+ padding-left: 0.7em;
+ padding-top: 1.375em;
+ margin-right: 20px;
+ font-weight: normal;
+ color: @menu-main-heading-color;
+}
+
+div.vectorMenu h3 a {
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 20px;
+ height: 2.5em;
+ .background-image-svg('images/arrow-down-icon.svg', 'images/arrow-down-icon.png');
+ background-position: 100% 70%;
+ background-repeat: no-repeat;
+ .transition(background-position 250ms);
+}
+
+div.vectorMenu.menuForceShow h3 a {
+ background-position: 100% 100%;
+}
+
+div.vectorMenuFocus h3 a {
+ .background-image-svg('images/arrow-down-focus-icon.svg', 'images/arrow-down-focus-icon.png');
+}
+
+div.vectorMenu div.menu {
+ // Match the width of the dropdown "heading" (the tab)
+ min-width: 100%;
+ position: absolute;
+ top: 2.5em;
+ left: -1px;
+ background-color: white;
+ border: solid 1px silver;
+ border-top-width: 0;
+ clear: both;
+ text-align: left;
+ display: none;
+}
+
+/* Enable forcing showing of the menu for accessibility */
+div.vectorMenu:hover div.menu,
+div.vectorMenu.menuForceShow div.menu {
+ display: block;
+}
+
+div.vectorMenu ul {
+ list-style-type: none;
+ list-style-image: none;
+ padding: 0;
+ margin: 0;
+ text-align: left;
+}
+
+/* Fixes old versions of FireFox */
+div.vectorMenu ul,
+x:-moz-any-link {
+ min-width: 5em;
+}
+
+/* Returns things back to normal in modern versions of FireFox */
+div.vectorMenu ul,
+x:-moz-any-link,
+x:default {
+ min-width: 0;
+}
+
+div.vectorMenu li {
+ padding: 0;
+ margin: 0;
+ text-align: left;
+ line-height: 1em;
+}
+
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div.vectorMenu li a {
+ display: inline-block;
+ padding: 0.5em;
+ white-space: nowrap;
+ color: @menu-link-color;
+ cursor: pointer;
+ font-size: 0.8em;
+}
+
+/* IGNORED BY IE6 */
+div.vectorMenu li > a {
+ display: block;
+}
+
+div.vectorMenu li.selected a,
+div.vectorMenu li.selected a:visited {
+ color: #333;
+ text-decoration: none;
+}
+
+@import 'watchstar.less';
--- /dev/null
+@import "mediawiki.mixins.rotation"
+
+/* Watch/Unwatch Icon Styling */
+#ca-unwatch.icon a,
+#ca-watch.icon a {
+ margin: 0;
+ padding: 0;
+ display: block;
+ width: 26px;
+ /* This hides the text but shows the background image */
+ padding-top: 3.1em;
+ margin-top: 0;
+ /* Only applied in IE6 */
+ margin-top: -0.8em !ie;
+ height: 0;
+ overflow: hidden;
+ background-position: 5px 60%;
+}
+#ca-unwatch.icon a {
+ .background-image-svg('images/unwatch-icon.svg', 'images/unwatch-icon.png');
+}
+#ca-watch.icon a {
+ .background-image-svg('images/watch-icon.svg', 'images/watch-icon.png');
+}
+#ca-unwatch.icon a:hover,
+#ca-unwatch.icon a:focus {
+ .background-image-svg('images/unwatch-icon-hl.svg', 'images/unwatch-icon-hl.png');
+}
+#ca-watch.icon a:hover,
+#ca-watch.icon a:focus {
+ .background-image-svg('images/watch-icon-hl.svg', 'images/watch-icon-hl.png');
+}
+#ca-unwatch.icon a.loading,
+#ca-watch.icon a.loading {
+ .background-image-svg('images/watch-icon-loading.svg', 'images/watch-icon-loading.png');
+ .rotation(700ms);
+ /* Suppress the hilarious rotating focus outline on Firefox */
+ outline: none;
+ cursor: default;
+ pointer-events: none;
+ background-position: 50% 60%;
+ -webkit-transform-origin: 50% 57%;
+ transform-origin: 50% 57%;
+}
+#ca-unwatch.icon a span,
+#ca-watch.icon a span {
+ display: none;
+}
--- /dev/null
+<public:attach event="ondocumentready" onevent="CSSHover()" />
+<script>
+/**
+ * Whatever:hover - V3.11
+ * ------------------------------------------------------------
+ * Author - Peter Nederlof, http://www.xs4all.nl/~peterned
+ * License - http://creativecommons.org/licenses/LGPL/2.1
+ *
+ * Special thanks to Sergiu Dumitriu, http://purl.org/net/sergiu,
+ * for fixing the expression loop.
+ *
+ * Whatever:hover is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Whatever:hover is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * howto: body { behavior:url("csshover3.htc"); }
+ * ------------------------------------------------------------
+ */
+
+window.CSSHover = (function(){
+
+ // regular expressions, used and explained later on.
+ var REG_INTERACTIVE = /(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;
+ var REG_AFFECTED = /(.*?)\:(hover|active|focus)/i;
+ var REG_PSEUDO = /[^:]+:([a-z\-]+).*/i;
+ var REG_SELECT = /(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;
+ var REG_CLASS = /\.([a-z0-9_\-]*on(hover|active|focus))/i;
+ var REG_MSIE = /msie (5|6|7)/i;
+ var REG_COMPAT = /backcompat/i;
+
+ // property mapping, real css properties must be used in order to clear expressions later on...
+ // Uses obscure css properties that no-one is likely to use. The properties are borrowed to
+ // set an expression, and are then restored to the most likely correct value.
+ var Properties = {
+ index: 0,
+ list: ['text-kashida', 'text-kashida-space', 'text-justify'],
+ get: function() {
+ return this.list[(this.index++)%this.list.length];
+ }
+ };
+
+ // camelize is used to convert css properties from (eg) text-kashida to textKashida
+ var camelize = function(str) {
+ return str.replace(/-(.)/mg, function(result, match){
+ return match.toUpperCase();
+ });
+ };
+
+ /**
+ * Local CSSHover object
+ * --------------------------
+ */
+
+ var CSSHover = {
+
+ // array of CSSHoverElements, used to unload created events
+ elements: [],
+
+ // buffer used for checking on duplicate expressions
+ callbacks: {},
+
+ // init, called once ondomcontentready via the exposed window.CSSHover function
+ init:function() {
+ // don't run in IE8 standards; expressions don't work in standards mode anyway,
+ // and the stuff we're trying to fix should already work properly
+ if(!REG_MSIE.test(navigator.userAgent) && !REG_COMPAT.test(window.document.compatMode)) {
+ return;
+ }
+
+ // start parsing the existing stylesheets
+ var sheets = window.document.styleSheets, l = sheets.length;
+ for(var i=0; i<l; i++) {
+ this.parseStylesheet(sheets[i]);
+ }
+ },
+
+ // called from init, parses individual stylesheets
+ parseStylesheet:function(sheet) {
+ // check sheet imports and parse those recursively
+ if(sheet.imports) {
+ try {
+ var imports = sheet.imports;
+ var l = imports.length;
+ for(var i=0; i<l; i++) {
+ this.parseStylesheet(sheet.imports[i]);
+ }
+ } catch(securityException){
+ // trycatch for various possible errors
+ }
+ }
+
+ // interate the sheet's rules and send them to the parser
+ try {
+ var rules = sheet.rules;
+ var r = rules.length;
+ for(var j=0; j<r; j++) {
+ this.parseCSSRule(rules[j], sheet);
+ }
+ } catch(someException){
+ // trycatch for various errors, most likely accessing the sheet's rules.
+ }
+ },
+
+ // magic starts here ...
+ parseCSSRule:function(rule, sheet) {
+
+ // The sheet is used to insert new rules into, this must be the same sheet the rule
+ // came from, to ensure that relative paths keep pointing to the right location.
+
+ // only parse a rule if it contains an interactive pseudo.
+ var select = rule.selectorText;
+ if(REG_INTERACTIVE.test(select)) {
+ var style = rule.style.cssText;
+
+ // affected elements are found by truncating the selector after the interactive pseudo,
+ // eg: "div li:hover" >> "div li"
+ var affected = REG_AFFECTED.exec(select)[1];
+
+ // that pseudo is needed for a classname, and defines the type of interaction (focus, hover, active)
+ // eg: "li:hover" >> "onhover"
+ var pseudo = select.replace(REG_PSEUDO, 'on$1');
+
+ // the new selector is going to use that classname in a new css rule,
+ // since IE6 doesn't support multiple classnames, this is merged into one classname
+ // eg: "li:hover" >> "li.onhover", "li.folder:hover" >> "li.folderonhover"
+ var newSelect = select.replace(REG_SELECT, '.$2' + pseudo);
+
+ // the classname is needed for the events that are going to be set on affected nodes
+ // eg: "li.folder:hover" >> "folderonhover"
+ var className = REG_CLASS.exec(newSelect)[1];
+
+ // no need to set the same callback more than once when the same selector uses the same classname
+ var hash = affected + className;
+ if(!this.callbacks[hash]) {
+
+ // affected elements are given an expression under a borrowed css property, because fake properties
+ // can't have their expressions cleared. Different properties are used per pseudo, to avoid
+ // expressions from overwriting eachother. The expression does a callback to CSSHover.patch,
+ // rerouted via the exposed window.CSSHover function.
+ var property = Properties.get();
+ var atRuntime = camelize(property);
+
+ // because the expression is added to the stylesheet, and styles are always applied to html that is
+ // dynamically added to the dom, the expression will also trigger for those new elements (provided
+ // they are selected by the affected selector).
+ sheet.addRule(affected, property + ':expression(CSSHover(this, "'+pseudo+'", "'+className+'", "'+atRuntime+'"))');
+
+ // hash it, so an identical selector/class combo does not duplicate the expression
+ this.callbacks[hash] = true;
+ }
+
+ // duplicate expressions need not be set, but the style could differ
+ sheet.addRule(newSelect, style);
+ }
+ },
+
+ // called via the expression, patches individual nodes
+ patch:function(node, type, className, property) {
+
+ // restores the borrowed css property to the value of its immediate parent, clearing
+ // the expression so that it's not repeatedly called.
+ try {
+ var value = node.parentNode.currentStyle[property];
+ node.style[property] = value;
+ } catch(e) {
+ // the above reset should never fail, but just in case, clear the runtimeStyle if it does.
+ // this will also stop the expression.
+ node.runtimeStyle[property] = '';
+ }
+
+ // just to make sure, also keep track of patched classnames locally on the node
+ if(!node.csshover) {
+ node.csshover = [];
+ }
+
+ // and check for it to prevent duplicate events with the same classname from being set
+ if(!node.csshover[className]) {
+ node.csshover[className] = true;
+
+ // create an instance for the given type and class
+ var element = new CSSHoverElement(node, type, className);
+
+ // and store that instance for unloading later on
+ this.elements.push(element);
+ }
+
+ // returns a dummy value to the expression
+ return type;
+ },
+
+ // unload stuff onbeforeunload
+ unload:function() {
+ try {
+
+ // remove events
+ var l = this.elements.length;
+ for(var i=0; i<l; i++) {
+ this.elements[i].unload();
+ }
+
+ // and set properties to null
+ this.elements = [];
+ this.callbacks = {};
+
+ } catch (e) {
+ }
+ }
+ };
+
+ /**
+ * CSSHoverElement
+ * --------------------------
+ */
+
+ // the event types associated with the interactive pseudos
+ var CSSEvents = {
+ onhover: { activator: 'onmouseenter', deactivator: 'onmouseleave' },
+ onactive: { activator: 'onmousedown', deactivator: 'onmouseup' },
+ onfocus: { activator: 'onfocus', deactivator: 'onblur' }
+ };
+
+ // CSSHoverElement constructor, called via CSSHover.patch
+ function CSSHoverElement(node, type, className) {
+
+ // the CSSHoverElement patches individual nodes by manually applying the events that should
+ // have fired by the css pseudoclasses, eg mouseenter and mouseleave for :hover.
+
+ this.node = node;
+ this.type = type;
+ var replacer = new RegExp('(^|\\s)'+className+'(\\s|$)', 'g');
+
+ // store event handlers for removal onunload
+ this.activator = function(){ node.className += ' ' + className; };
+ this.deactivator = function(){ node.className = node.className.replace(replacer, ' '); };
+
+ // add the events
+ node.attachEvent(CSSEvents[type].activator, this.activator);
+ node.attachEvent(CSSEvents[type].deactivator, this.deactivator);
+ }
+
+ CSSHoverElement.prototype = {
+ // onbeforeunload, called via CSSHover.unload
+ unload:function() {
+
+ // remove events
+ this.node.detachEvent(CSSEvents[this.type].activator, this.activator);
+ this.node.detachEvent(CSSEvents[this.type].deactivator, this.deactivator);
+
+ // and set properties to null
+ this.activator = null;
+ this.deactivator = null;
+ this.node = null;
+ this.type = null;
+ }
+ };
+
+ // add the unload to the onbeforeunload event
+ window.attachEvent('onbeforeunload', function(){
+ CSSHover.unload();
+ });
+
+ /**
+ * Public hook
+ * --------------------------
+ */
+
+ return function(node, type, className, property) {
+ if(node) {
+ // called via the css expression; patches individual nodes
+ return CSSHover.patch(node, type, className, property);
+ } else {
+ // called ondomcontentready via the public:attach node
+ CSSHover.init();
+ }
+ };
+
+})();
+</script>
\ No newline at end of file
--- /dev/null
+<public:attach event="ondocumentready" onevent="CSSHover()" />
+<script>
+/**
+ * Whatever:hover - V3.11
+ * http://www.xs4all.nl/~peterned/
+ *
+ * Copyright (c) 2009 Peter Nederlof
+ * Licensed under the LGPL license
+ * http://creativecommons.org/licenses/LGPL/2.1
+ */
+window.CSSHover=(function(){var m=/(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;var n=/(.*?)\:(hover|active|focus)/i;var o=/[^:]+:([a-z\-]+).*/i;var p=/(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;var q=/\.([a-z0-9_\-]*on(hover|active|focus))/i;var s=/msie (5|6|7)/i;var t=/backcompat/i;var u={index:0,list:['text-kashida','text-kashida-space','text-justify'],get:function(){return this.list[(this.index++)%this.list.length]}};var v=function(c){return c.replace(/-(.)/mg,function(a,b){return b.toUpperCase()})};var w={elements:[],callbacks:{},init:function(){if(!s.test(navigator.userAgent)&&!t.test(window.document.compatMode)){return}var a=window.document.styleSheets,l=a.length;for(var i=0;i<l;i++){this.parseStylesheet(a[i])}},parseStylesheet:function(a){if(a.imports){try{var b=a.imports;var l=b.length;for(var i=0;i<l;i++){this.parseStylesheet(a.imports[i])}}catch(securityException){}}try{var c=a.rules;var r=c.length;for(var j=0;j<r;j++){this.parseCSSRule(c[j],a)}}catch(someException){}},parseCSSRule:function(a,b){var c=a.selectorText;if(m.test(c)){var d=a.style.cssText;var e=n.exec(c)[1];var f=c.replace(o,'on$1');var g=c.replace(p,'.$2'+f);var h=q.exec(g)[1];var i=e+h;if(!this.callbacks[i]){var j=u.get();var k=v(j);b.addRule(e,j+':expression(CSSHover(this, "'+f+'", "'+h+'", "'+k+'"))');this.callbacks[i]=true}b.addRule(g,d)}},patch:function(a,b,c,d){try{var f=a.parentNode.currentStyle[d];a.style[d]=f}catch(e){a.runtimeStyle[d]=''}if(!a.csshover){a.csshover=[]}if(!a.csshover[c]){a.csshover[c]=true;var g=new CSSHoverElement(a,b,c);this.elements.push(g)}return b},unload:function(){try{var l=this.elements.length;for(var i=0;i<l;i++){this.elements[i].unload()}this.elements=[];this.callbacks={}}catch(e){}}};var x={onhover:{activator:'onmouseenter',deactivator:'onmouseleave'},onactive:{activator:'onmousedown',deactivator:'onmouseup'},onfocus:{activator:'onfocus',deactivator:'onblur'}};function CSSHoverElement(a,b,c){this.node=a;this.type=b;var d=new RegExp('(^|\\s)'+c+'(\\s|$)','g');this.activator=function(){a.className+=' '+c};this.deactivator=function(){a.className=a.className.replace(d,' ')};a.attachEvent(x[b].activator,this.activator);a.attachEvent(x[b].deactivator,this.deactivator)}CSSHoverElement.prototype={unload:function(){this.node.detachEvent(x[this.type].activator,this.activator);this.node.detachEvent(x[this.type].deactivator,this.deactivator);this.activator=null;this.deactivator=null;this.node=null;this.type=null}};window.attachEvent('onbeforeunload',function(){w.unload()});return function(a,b,c,d){if(a){return w.patch(a,b,c,d)}else{w.init()}}})();
+</script>
--- /dev/null
+{
+ "@metadata": {
+ "authors": []
+ },
+ "skinname-vector": "Vector",
+ "vector-desc": "Modern version of MonoBook with fresh look and many usability improvements",
+ "vector.css": "/* CSS placed here will affect users of the Vector skin */",
+ "vector.js": "/* Any JavaScript here will be loaded for users using the Vector skin */",
+ "vector-action-addsection": "Add topic",
+ "vector-action-delete": "Delete",
+ "vector-action-move": "Move",
+ "vector-action-protect": "Protect",
+ "vector-action-undelete": "Undelete",
+ "vector-action-unprotect": "Change protection",
+ "vector-view-create": "Create",
+ "vector-view-edit": "Edit",
+ "vector-view-history": "View history",
+ "vector-view-view": "Read",
+ "vector-view-viewsource": "View source",
+ "vector-more-actions": "More"
+}
--- /dev/null
+{
+ "@metadata": {
+ "authors": []
+ },
+ "skinname-vector": "{{optional}}",
+ "vector-desc": "{{desc|name=Vector|url=http://www.mediawiki.org/wiki/Skin:Vector}}",
+ "vector.css": "{{optional}}",
+ "vector.js": "{{optional}}",
+ "vector-action-addsection": "Used in the Vector skin. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}",
+ "vector-action-delete": "Used in the Vector skin, as the name of a tab at the top of the page. See for example {{canonicalurl:Main_Page|useskin=vector}}\n\n{{Identical|Delete}}",
+ "vector-action-move": "Used in the Vector skin, on the tabs at the top of the page. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}\n\n{{Identical|Move}}",
+ "vector-action-protect": "Tab at top of page, in vector skin\n\n{{Identical|Protect}}",
+ "vector-action-undelete": "Tab at top of page, in vector skin.\n{{Identical|Undelete}}",
+ "vector-action-unprotect": "Tab at top of page, in vector skin.\n{{Identical|Change protection}}",
+ "vector-view-create": "Tab label in the Vector skin. See for example {{canonicalurl:Foo|useskin=vector}}\n{{Identical|Create}}",
+ "vector-view-edit": "Tab label in the Vector skin. See for example {{canonicalurl:Main_Page|useskin=vector}}\n{{Identical|Edit}}",
+ "vector-view-history": "Tab label in the Vector skin. See for example {{canonicalurl:Main_Page|useskin=vector}}\n{{Identical|View history}}",
+ "vector-view-view": "Tab label in the Vector skin (verb). See for example {{canonicalurl:Main_Page|useskin=vector}}.\n{{Identical|Read}}",
+ "vector-view-viewsource": "Tab label in the Vector skin.\n{{Identical|View source}}",
+ "vector-more-actions": "Label in the Vector skin's menu for the less-important or rarer actions which are not shown as tabs (like moving the page, or for sysops deleting or protecting the page), as well as (for users with a narrow viewing window in their browser) the less-important tab actions which the user's browser is unable to fit in. {{Identical|More}}"
+}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M6.001 2.998l5.001 5-5.001 5z" fill="#797979"/></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M9.999 13.002l-5.001-5 5.001-5z" fill="#797979"/></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="22" height="16"><path d="M15.502 6.001l-5 5.001-5-5.001z" fill="#929292"/></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="22" height="16"><path d="M15.502 6.001l-5 5.001-5-5.001z" fill="#797979"/></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M13.002 6.001l-5 5.001-5-5.001z" fill="#797979"/></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"><g transform="translate(-826.429 -698.791)"><rect width="5.982" height="5.982" x="826.929" y="702.309" fill="#fff" stroke="#06c"/><g><path d="M831.194 698.791h5.234v5.391l-1.571 1.545-1.31-1.31-2.725 2.725-2.689-2.689 2.808-2.808-1.311-1.311z" fill="#06f"/><path d="M835.424 699.795l.022 4.885-1.817-1.817-2.881 2.881-1.228-1.228 2.881-2.881-1.851-1.851z" fill="#fff"/></g></g></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"><g transform="translate(-826.429 -698.791)"><rect width="5.982" height="5.982" x="-835.929" y="702.309" transform="scale(-1 1)" fill="#fff" stroke="#06c"/><g><path d="M831.663 698.791h-5.234v5.391l1.571 1.545 1.31-1.31 2.725 2.725 2.689-2.689-2.808-2.808 1.311-1.311z" fill="#06f"/><path d="M827.433 699.795l-.022 4.885 1.817-1.817 2.881 2.881 1.228-1.228-2.881-2.881 1.851-1.851z" fill="#fff"/></g></g></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#6c6c6c" fill="none"><path d="M11.29 11.71l-4-4"/><circle cx="5" cy="5" r="4"/></g></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#6c6c6c" fill="none"><path d="M.71 11.71l4-4"/><circle cx="7" cy="5" r="4"/></g></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><linearGradient id="a"><stop offset="0" stop-color="#c2edff"/><stop offset=".5" stop-color="#68bdff"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient x1="13.47" y1="14.363" x2="4.596" y2="3.397" id="b" xlink:href="#a" gradientUnits="userSpaceOnUse"/></defs><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="url(#b)" stroke="#c8b250" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><linearGradient id="a"><stop offset="0" stop-color="#c2edff"/><stop offset=".5" stop-color="#68bdff"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient x1="13.47" y1="14.363" x2="4.596" y2="3.397" id="b" xlink:href="#a" gradientUnits="userSpaceOnUse"/></defs><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="url(#b)" stroke="#7cb5d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="12" height="13.837"><defs><linearGradient id="e"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="b"><stop offset="0" stop-color="#3b74bc"/><stop offset="1" stop-color="#2d5990"/></linearGradient><linearGradient id="c"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#c9c9c9"/></linearGradient><linearGradient id="a"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="d"><stop offset="0" stop-color="#f4d9b1"/><stop offset="1" stop-color="#df9725"/></linearGradient><radialGradient cx="31.113" cy="19.009" r="8.662" fx="31.113" fy="19.009" id="f" xlink:href="#a" gradientUnits="userSpaceOnUse"/><radialGradient cx="28.09" cy="27.203" r="13.565" fx="28.09" fy="27.203" id="g" xlink:href="#b" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.298 0 0 .885 -8.359 4.94)"/><linearGradient x1="30.936" y1="29.553" x2="30.936" y2="35.803" id="h" xlink:href="#c" gradientUnits="userSpaceOnUse"/><radialGradient cx="31.113" cy="19.009" r="8.662" fx="31.113" fy="19.009" id="i" xlink:href="#a" gradientUnits="userSpaceOnUse"/><radialGradient cx="29.345" cy="17.064" r="9.162" fx="29.345" fy="17.064" id="j" xlink:href="#d" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.788 0 0 .788 6.221 3.618)"/><linearGradient x1="20.662" y1="35.818" x2="22.627" y2="36.218" id="k" xlink:href="#e" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.983 .182 -.182 .983 6.232 -2.651)"/><linearGradient x1="22.687" y1="36.39" x2="21.408" y2="35.74" id="l" xlink:href="#e" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-.978 .21 .21 .978 55.11 -3.945)"/></defs><g color="#000"><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.693 0 0 .374 -15.548 3.481)" fill="url(#f)" fill-rule="evenodd" overflow="visible"/><path d="M4.046 12.398h4.137c1.172 0 2.332-.43 2.758-1.655.404-1.163.069-3.378-2.551-5.171h-4.895c-2.62 1.655-2.947 3.917-2.344 5.24.614 1.347 1.655 1.586 2.896 1.586z" fill="url(#g)" fill-rule="evenodd" stroke="#204a87" stroke-linecap="round" stroke-linejoin="round" overflow="visible" stroke-width="0.39"/><path d="M4.321 6.193c1.241 1.103 1.793 5.102 1.793 5.102s.552-3.999 1.517-5.171l-3.309.069z" fill="url(#h)" fill-rule="evenodd" overflow="visible"/><path d="M5.21 6.607s-.839.648-.767 1.428c-.796-.702-.819-2.048-.819-2.048l1.586.62z" fill="#729fcf" fill-rule="evenodd" overflow="visible"/><path d="M4.018 11.992l4.092-.009c1.029 0 2.049-.377 2.422-1.453.355-1.022-.037-2.967-2.338-4.542l-4.495-.095c-2.301 1.453-2.747 3.441-2.208 4.697.538 1.256 1.324 1.393 2.526 1.401z" opacity=".215" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" overflow="visible" fill="none" stroke-width="0.39"/><path d="M6.941 6.607s.839.648.767 1.428c.796-.702.819-2.048.819-2.048l-1.586.62z" fill="#729fcf" fill-rule="evenodd" overflow="visible"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.39 0 0 .39 -6.138 -2.475)" fill="url(#i)" fill-rule="evenodd" overflow="visible"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" fill="url(#j)" fill-rule="evenodd" stroke="#c17d11" stroke-linecap="round" stroke-linejoin="round" overflow="visible" transform="matrix(.39 0 0 .39 -6.089 -3.84)"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.342 0 0 .342 -4.598 -2.929)" opacity=".196" stroke="#fff" stroke-width="1.14" stroke-linecap="round" stroke-linejoin="round" overflow="visible" fill="none"/><path d="M2.433 12.062c-.487-.213-.704-.725-.704-.725.328-1.587 1.451-2.748 1.451-2.748s-.889 2.5-.746 3.473z" opacity=".228" fill="url(#k)" fill-rule="evenodd" overflow="visible"/><path d="M9.806 11.728c.48-.227.704-.781.704-.781-.374-1.577-1.551-2.669-1.551-2.669s.961 2.474.847 3.45z" opacity=".228" fill="url(#l)" fill-rule="evenodd" overflow="visible"/></g></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#c8b250" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#d1d1d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#7cb5d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
--- /dev/null
+/* Vector screen styles for high definition displays */
+
+@import "variables.less";
+
+div#content {
+ margin-left: 11em;
+ padding: 1.25em 1.5em 1.5em 1.5em;
+}
+#p-logo {
+ left: @menu-main-logo-left;
+}
+div#footer {
+ margin-left: 11em;
+ padding: 1.25em;
+}
+#mw-panel {
+ padding-left: 0.5em;
+}
+#p-search {
+ margin-right: 1em;
+}
+#left-navigation {
+ margin-left: 11em;
+}
+#p-personal {
+ right: 1em;
+}
+#mw-head-base {
+ margin-left: 11em;
+}
--- /dev/null
+/* Vector screen styles */
+
+@import "variables.less";
+
+@import "components/common.less";
+@import "components/animations.less";
+@import "components/navigation.less";
+@import "components/footer.less";
+@import 'components/notifications.less';
+@import "components/externalLinks.less";
--- /dev/null
+/**
+ * Adjusts for decreased margin-bottom for h2 elements inside #content div
+ * introduced in March / April 2014 typography update.
+ */
+table.mw-specialpages-table {
+ margin-top: 0;
+}
--- /dev/null
+@import "mediawiki.mixins";
+@import "variables";
+
+/**
+ * The following code is highly modified from monobook. It would be nice if the
+ * preftoc id was more human readable like preferences-toc for instance,
+ * howerver this would require backporting the other skins.
+ */
+
+#preftoc {
+ /* Tabs */
+ width: 100%;
+ float: left;
+ clear: both;
+ margin: 0 !important;
+ padding: 0 !important;
+ .background-image('images/preferences/break.png');
+ background-position: bottom left;
+ background-repeat: no-repeat;
+
+ li {
+ /* Tab */
+ float: left;
+ margin: 0;
+ padding: 0;
+ padding-right: 1px;
+ height: 2.25em;
+ white-space: nowrap;
+ list-style-type: none;
+ list-style-image: none;
+ .background-image('images/preferences/break.png');
+ background-position: bottom right;
+ background-repeat: no-repeat;
+
+ /* Sadly, IE6 won't understand this */
+ &:first-child {
+ margin-left: 1px;
+ }
+
+ &.selected {
+ a {
+ .background-image('images/preferences/fade.png');
+ background-position: bottom;
+ background-repeat: repeat-x;
+ color: #333;
+ text-decoration: none;
+ }
+ }
+ }
+
+ a,
+ a:active {
+ display: inline-block;
+ position: relative;
+ color: @menu-link-color;
+ padding: 0.5em;
+ text-decoration: none;
+ background-image: none;
+ font-size: 0.9em;
+ }
+
+ a:hover,
+ a:focus {
+ text-decoration: underline;
+ }
+}
+
+#preferences {
+ float: left;
+ width: 100%;
+ margin: 0;
+ margin-top: -2px;
+ clear: both;
+ border: solid 1px #ccc;
+ background-color: #fafafa;
+
+ fieldset {
+ border: none;
+ border-top: solid 1px #ccc;
+
+ &.prefsection {
+ border: none;
+ padding: 0;
+ margin: 1em;
+
+ legend.mainLegend {
+ display: none;
+ }
+ }
+ }
+
+ legend {
+ color: #666;
+ }
+
+ td {
+ padding-left: 0.5em;
+ padding-right: 0.5em;
+ }
+
+ div.mw-prefs-buttons {
+ padding: 1em;
+
+ input {
+ margin-right: 0.25em;
+ }
+ }
+}
+
+.htmlform-tip {
+ font-size: x-small;
+ padding: .2em 2em;
+ color: #666;
+}
--- /dev/null
+@html-font-size: 100%;
+
+// Page content
+// FIXME: Use global variable since Echo and CentralNotice use this variable
+@content-border-color: #a7d7f9;
+// FIXME: Find an open font that works with this stack and is readable by Windows users
+@content-font-family: sans-serif;
+@content-font-color: #252525;
+@content-font-size: 0.875em;
+@content-line-height: 1.6;
+@content-padding: 1em;
+@content-heading-font-size: 1.8em;
+@content-heading-font-family: "Linux Libertine", Georgia, Times, serif;
+@body-background-color: #fff;
+@heading-line-height: 1.3;
+
+// Navigation
+@menu-background-color: #f6f6f6;
+
+// Common menu
+@menu-link-color: #0645ad;
+
+// Main menu
+@menu-main-font-size: inherit;
+
+@menu-main-heading-font-size: 0.75em;
+@menu-main-heading-padding: 0.25em 0 0.25em 0.25em;
+@menu-main-heading-color: #4d4d4d;
+
+@menu-main-body-font-size: 0.75em;
+@menu-main-body-link-color: #0645ad;
+@menu-main-body-link-visited-color: #0b0080;
+@menu-main-body-margin: 0 0 0 1.25em;
+@menu-main-body-padding: 0;
+
+@menu-main-logo-left: 0.5em;
+
+// Personal menu
+@menu-personal-font-size: 0.75em;
--- /dev/null
+/**
+ * Vector-specific scripts
+ */
+jQuery( function ( $ ) {
+ /**
+ * Focus search input at the very end
+ */
+ $( '#searchInput' ).attr( 'tabindex', $( document ).lastTabIndex() + 1 );
+
+ /**
+ * Dropdown menu accessibility
+ */
+ $( 'div.vectorMenu' ).each( function () {
+ var $el = $( this );
+ $el.find( '> h3 > a' ).parent()
+ .attr( 'tabindex', '0' )
+ // For accessibility, show the menu when the h3 is clicked (bug 24298/46486)
+ .on( 'click keypress', function ( e ) {
+ if ( e.type === 'click' || e.which === 13 ) {
+ $el.toggleClass( 'menuForceShow' );
+ e.preventDefault();
+ }
+ } )
+ // When the heading has focus, also set a class that will change the arrow icon
+ .focus( function () {
+ $el.find( '> a' ).addClass( 'vectorMenuFocus' );
+ } )
+ .blur( function () {
+ $el.find( '> a' ).removeClass( 'vectorMenuFocus' );
+ } )
+ .find( '> a:first' )
+ // As the h3 can already be focused there's no need for the link to be focusable
+ .attr( 'tabindex', '-1' );
+ } );
+
+ /**
+ * Sidebar
+ */
+ $( '#mw-panel > .portal:first' ).addClass( 'first' );
+
+ /**
+ * Collapsible tabs
+ */
+ var $cactions = $( '#p-cactions' ),
+ $tabContainer = $( '#p-views ul' ),
+ originalDropdownWidth = $cactions.width();
+
+ // Bind callback functions to animate our drop down menu in and out
+ // and then call the collapsibleTabs function on the menu
+ $tabContainer
+ .bind( 'beforeTabCollapse', function () {
+ // If the dropdown was hidden, show it
+ if ( $cactions.hasClass( 'emptyPortlet' ) ) {
+ $cactions
+ .removeClass( 'emptyPortlet' )
+ .find( 'h3' )
+ .css( 'width', '1px' ).animate( { 'width': originalDropdownWidth }, 'normal' );
+ }
+ } )
+ .bind( 'beforeTabExpand', function () {
+ // If we're removing the last child node right now, hide the dropdown
+ if ( $cactions.find( 'li' ).length === 1 ) {
+ $cactions.find( 'h3' ).animate( { 'width': '1px' }, 'normal', function () {
+ $( this ).attr( 'style', '' )
+ .parent().addClass( 'emptyPortlet' );
+ });
+ }
+ } )
+ .collapsibleTabs( {
+ expandCondition: function ( eleWidth ) {
+ // (This looks a bit awkward because we're doing expensive queries as late as possible.)
+
+ var distance = $.collapsibleTabs.calculateTabDistance();
+ // If there are at least eleWidth + 1 pixels of free space, expand.
+ // We add 1 because .width() will truncate fractional values but .offset() will not.
+ if ( distance >= eleWidth + 1 ) {
+ return true;
+ } else {
+ // Maybe we can still expand? Account for the width of the "Actions" dropdown if the
+ // expansion would hide it.
+ if ( $cactions.find( 'li' ).length === 1 ) {
+ return distance >= eleWidth + 1 - originalDropdownWidth;
+ } else {
+ return false;
+ }
+ }
+ },
+ collapseCondition: function () {
+ // (This looks a bit awkward because we're doing expensive queries as late as possible.)
+ // TODO The dropdown itself should probably "fold" to just the down-arrow (hiding the text)
+ // if it can't fit on the line?
+
+ // If there's an overlap, collapse.
+ if ( $.collapsibleTabs.calculateTabDistance() < 0 ) {
+ // But only if the width of the tab to collapse is smaller than the width of the dropdown
+ // we would have to insert. An example language where this happens is Lithuanian (lt).
+ if ( $cactions.hasClass( 'emptyPortlet' ) ) {
+ return $tabContainer.children( 'li.collapsible:last' ).width() > originalDropdownWidth;
+ } else {
+ return true;
+ }
+ } else {
+ return false;
+ }
+ }
+ } );
+} );
+++ /dev/null
-/* 6.0 - only fixes */
-/* content area */
-/* workaround for various ie float bugs */
-div#column-content {
- float: none;
- margin-left: 0;
- height: 1%;
-}
-
-div#column-content div#content {
- margin-left: 12.2em;
- margin-top: 3em;
- height: 1%;
-}
-
-.rtl div#column-content div#content {
- margin-right: 12.2em;
- margin-left: 0;
-}
-
-div#column-one {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 4;
-}
-
-.rtl div#column-one {
- left: auto;
- right: 0;
-}
-
-div#footer {
- margin-left: 13.6em;
- border-left: 1px solid #fabd23;
-}
-
-.rtl div#footer {
- margin-left: 0;
- margin-right: 13.6em;
- border-left: none;
- border-right: 1px solid #fabd23;
-}
-
-/* float/negative margin brokenness */
-* html div#footer {
- margin-top: 0;
-}
-
-* html div#column-content {
- display: inline;
- margin-bottom: 0;
-}
-
-/* the tabs */
-
-#p-cactions {
- z-index: 3;
-}
-
-#p-cactions li {
- padding-bottom: 0 !important;
- border: none;
- background-color: transparent;
- cursor: default;
- float: none !important;
-}
-
-#p-cactions li a {
- display: inline-block !important;
- vertical-align: top;
- padding-bottom: 0;
- border: solid #aaa;
- border-width: 1px 1px 0;
-}
-
-#p-cactions li.selected a {
- border-color: #fabd23;
- padding-bottom: 0.17em;
-}
-
-#p-cactions li a:hover {
- padding-bottom: 0.17em;
-}
-
-#p-navigation a {
- display: inline-block;
- width: 100%;
-}
-
-#portal-personaltools {
- padding-bottom: 0.1em;
-}
-
-.rtl a.feedlink {
- background-position: right;
- padding-right: 0;
- padding-left: 16px;
-}
-
-/* show the hand */
-#p-logo a,
-#p-logo a:hover {
- cursor: pointer;
-}
-
-div.visualClear {
- width: 100%;
- line-height: 0;
-}
-
-textarea {
- width: 96%;
-}
-
-#catlinks,
-div.tright,
-div.tleft {
- position: relative;
-}
-
-/* bug 12846 */
-body.rtl #preftoc a, body.rtl #preftoc a:active {
- float: left;
-}
+++ /dev/null
-/* 7.0 - only fixes */
-/* content area */
-/* workaround for various ie float bugs */
-
-/* This bit is needed to make links clickable... WTF */
-div#column-content div#content {
- margin-left: 12.2em;
- margin-top: 3em;
- height: 1%;
-}
-
-.rtl div#column-content div#content {
- margin-right: 12.2em;
- margin-left: 0;
-}
-
-.rtl div#column-one {
- /* For some reason it tries to inherit the padding-top into every div,
- * and I can't figure out how to get it back off.
- * Margin works correctly for this use, though.
- */
- padding-top: 0;
- margin-top: 160px;
-}
-
-/* These elements also have padding-left: 20px; in main.css, but in RTL mode this is flipped.
- * That's good in normal browsers, but in IE7 it needs to not be flipped for some daft reason.
- * Also clear the right margin (originally margin-left: 1em)
- */
-li#pt-userpage, li#pt-anonuserpage, li#pt-login {
- padding-left: 20px;
- margin-right: 0;
-}
-
-.rtl a.feedlink {
- background-position: right;
- padding-right: 0;
- padding-left: 16px;
-}
-
-/* the tabs */
-
-#p-cactions {
- z-index: 3;
-}
-
-#p-cactions li {
- padding-bottom: 0 !important;
- border: none;
- background-color: transparent;
- cursor: default;
- float: none !important;
-}
-
-#p-cactions li a {
- display: inline-block !important;
- vertical-align: top;
- padding-bottom: 0;
- border: solid #aaa;
- border-width: 1px 1px 0;
-}
-
-#p-cactions li.selected a {
- border-color: #fabd23;
- padding-bottom: 0.17em;
-}
-
-#p-cactions li a:hover {
- padding-bottom: 0.17em;
-}
-
-#p-navigation a {
- display: inline-block;
- width: 100%;
-}
-
-#portal-personaltools {
- padding-bottom: 0.1em;
-}
-
-textarea {
- width: 96%;
-}
-
-/*
-#catlinks,
-div.tright,
-div.tleft {
- position: relative;
-}
-*/
-
-div#footer li {
- /* Work around bug with inline <li> tags with right margins and nowrap */
- margin-right: 0;
-}
+++ /dev/null
-<?php
-/**
- * MonoBook nouveau.
- *
- * Translated from gwicke's previous TAL template version to remove
- * dependency on PHPTAL.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @todo document
- * @file
- * @ingroup Skins
- */
-
-if ( !defined( 'MEDIAWIKI' ) ) {
- die( -1 );
-}
-
-/**
- * Inherit main code from SkinTemplate, set the CSS and template filter.
- * @todo document
- * @ingroup Skins
- */
-class SkinMonoBook extends SkinTemplate {
- /** Using monobook. */
- public $skinname = 'monobook';
- public $stylename = 'monobook';
- public $template = 'MonoBookTemplate';
-
- /**
- * @param OutputPage $out
- */
- function setupSkinUserCss( OutputPage $out ) {
- parent::setupSkinUserCss( $out );
-
- $out->addModuleStyles( array( 'mediawiki.skinning.interface', 'skins.monobook.styles' ) );
-
- // TODO: Migrate all of these
- $out->addStyle( 'monobook/IE60Fixes.css', 'screen', 'IE 6' );
- $out->addStyle( 'monobook/IE70Fixes.css', 'screen', 'IE 7' );
- }
-}
-
-/**
- * @todo document
- * @ingroup Skins
- */
-class MonoBookTemplate extends BaseTemplate {
-
- /**
- * Template filter callback for MonoBook skin.
- * Takes an associative array of data set from a SkinTemplate-based
- * class, and a wrapper for MediaWiki's localization database, and
- * outputs a formatted page.
- *
- * @access private
- */
- function execute() {
- // Suppress warnings to prevent notices about missing indexes in $this->data
- wfSuppressWarnings();
-
- $this->html( 'headelement' );
- ?><div id="globalWrapper">
- <div id="column-content">
- <div id="content" class="mw-body-primary" role="main">
- <a id="top"></a>
- <?php
- if ( $this->data['sitenotice'] ) {
- ?>
- <div id="siteNotice"><?php
- $this->html( 'sitenotice' )
- ?></div><?php
- }
- ?>
-
- <h1 id="firstHeading" class="firstHeading" lang="<?php
- $this->data['pageLanguage'] =
- $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
- $this->text( 'pageLanguage' );
- ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
-
- <div id="bodyContent" class="mw-body">
- <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
- <div id="contentSub"<?php
- $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' )
- ?></div>
- <?php if ( $this->data['undelete'] ) { ?>
- <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
- <?php
-}
- ?><?php
- if ( $this->data['newtalk'] ) {
- ?>
- <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
- <?php
- }
- ?>
- <div id="jump-to-nav" class="mw-jump"><?php
- $this->msg( 'jumpto' )
- ?> <a href="#column-one"><?php
- $this->msg( 'jumptonavigation' )
- ?></a><?php
- $this->msg( 'comma-separator' )
- ?><a href="#searchInput"><?php
- $this->msg( 'jumptosearch' )
- ?></a></div>
-
- <!-- start content -->
- <?php $this->html( 'bodytext' ) ?>
- <?php
- if ( $this->data['catlinks'] ) {
- $this->html( 'catlinks' );
- }
- ?>
- <!-- end content -->
- <?php
- if ( $this->data['dataAfterContent'] ) {
- $this->html( 'dataAfterContent'
- );
- }
- ?>
- <div class="visualClear"></div>
- </div>
- </div>
- </div>
- <div id="column-one"<?php $this->html( 'userlangattributes' ) ?>>
- <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
- <?php $this->cactions(); ?>
- <div class="portlet" id="p-personal" role="navigation">
- <h3><?php $this->msg( 'personaltools' ) ?></h3>
-
- <div class="pBody">
- <ul<?php $this->html( 'userlangattributes' ) ?>>
- <?php foreach ( $this->getPersonalTools() as $key => $item ) { ?>
- <?php echo $this->makeListItem( $key, $item ); ?>
-
- <?php
-}
- ?>
- </ul>
- </div>
- </div>
- <div class="portlet" id="p-logo" role="banner">
- <?php
- echo Html::element( 'a', array(
- 'href' => $this->data['nav_urls']['mainpage']['href'],
- 'style' => "background-image: url({$this->data['logopath']});" )
- + Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ); ?>
-
- </div>
- <?php
- $this->renderPortals( $this->data['sidebar'] );
- ?>
- </div><!-- end of the left (by default at least) column -->
- <div class="visualClear"></div>
- <?php
- $validFooterIcons = $this->getFooterIcons( "icononly" );
- $validFooterLinks = $this->getFooterLinks( "flat" ); // Additional footer links
-
- if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) {
- ?>
- <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
- <?php
- $footerEnd = '</div>';
- } else {
- $footerEnd = '';
- }
-
- foreach ( $validFooterIcons as $blockName => $footerIcons ) {
- ?>
- <div id="f-<?php echo htmlspecialchars( $blockName ); ?>ico">
- <?php foreach ( $footerIcons as $icon ) { ?>
- <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
-
- <?php
-}
- ?>
- </div>
- <?php
- }
-
- if ( count( $validFooterLinks ) > 0 ) {
- ?>
- <ul id="f-list">
- <?php
- foreach ( $validFooterLinks as $aLink ) {
- ?>
- <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
- <?php
- }
- ?>
- </ul>
- <?php
- }
-
- echo $footerEnd;
- ?>
-
- </div>
- <?php
- $this->printTrail();
- echo Html::closeElement( 'body' );
- echo Html::closeElement( 'html' );
- wfRestoreWarnings();
- } // end of execute() method
-
- /*************************************************************************************************/
-
- /**
- * @param array $sidebar
- */
- protected function renderPortals( $sidebar ) {
- if ( !isset( $sidebar['SEARCH'] ) ) {
- $sidebar['SEARCH'] = true;
- }
- if ( !isset( $sidebar['TOOLBOX'] ) ) {
- $sidebar['TOOLBOX'] = true;
- }
- if ( !isset( $sidebar['LANGUAGES'] ) ) {
- $sidebar['LANGUAGES'] = true;
- }
-
- foreach ( $sidebar as $boxName => $content ) {
- if ( $content === false ) {
- continue;
- }
-
- if ( $boxName == 'SEARCH' ) {
- $this->searchBox();
- } elseif ( $boxName == 'TOOLBOX' ) {
- $this->toolbox();
- } elseif ( $boxName == 'LANGUAGES' ) {
- $this->languageBox();
- } else {
- $this->customBox( $boxName, $content );
- }
- }
- }
-
- function searchBox() {
- global $wgUseTwoButtonsSearchForm;
- ?>
- <div id="p-search" class="portlet" role="search">
- <h3><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
-
- <div id="searchBody" class="pBody">
- <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
- <input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
- <?php echo $this->makeSearchInput( array( "id" => "searchInput" ) ); ?>
-
- <?php
- echo $this->makeSearchButton(
- "go",
- array( "id" => "searchGoButton", "class" => "searchButton" )
- );
-
- if ( $wgUseTwoButtonsSearchForm ) {
- ?> 
- <?php echo $this->makeSearchButton(
- "fulltext",
- array( "id" => "mw-searchButton", "class" => "searchButton" )
- );
- } else {
- ?>
-
- <div><a href="<?php
- $this->text( 'searchaction' )
- ?>" rel="search"><?php $this->msg( 'powersearch-legend' ) ?></a></div><?php
- } ?>
-
- </form>
-
- <?php $this->renderAfterPortlet( 'search' ); ?>
- </div>
- </div>
- <?php
- }
-
- /**
- * Prints the cactions bar.
- * Shared between MonoBook and Modern
- */
- function cactions() {
- ?>
- <div id="p-cactions" class="portlet" role="navigation">
- <h3><?php $this->msg( 'views' ) ?></h3>
-
- <div class="pBody">
- <ul><?php
- foreach ( $this->data['content_actions'] as $key => $tab ) {
- echo '
- ' . $this->makeListItem( $key, $tab );
- } ?>
-
- </ul>
- <?php $this->renderAfterPortlet( 'cactions' ); ?>
- </div>
- </div>
- <?php
- }
-
- /*************************************************************************************************/
- function toolbox() {
- ?>
- <div class="portlet" id="p-tb" role="navigation">
- <h3><?php $this->msg( 'toolbox' ) ?></h3>
-
- <div class="pBody">
- <ul>
- <?php
- foreach ( $this->getToolbox() as $key => $tbitem ) {
- ?>
- <?php echo $this->makeListItem( $key, $tbitem ); ?>
-
- <?php
- }
- wfRunHooks( 'MonoBookTemplateToolboxEnd', array( &$this ) );
- wfRunHooks( 'SkinTemplateToolboxEnd', array( &$this, true ) );
- ?>
- </ul>
- <?php $this->renderAfterPortlet( 'tb' ); ?>
- </div>
- </div>
- <?php
- }
-
- /*************************************************************************************************/
- function languageBox() {
- if ( $this->data['language_urls'] !== false ) {
- ?>
- <div id="p-lang" class="portlet" role="navigation">
- <h3<?php $this->html( 'userlangattributes' ) ?>><?php $this->msg( 'otherlanguages' ) ?></h3>
-
- <div class="pBody">
- <ul>
- <?php foreach ( $this->data['language_urls'] as $key => $langlink ) { ?>
- <?php echo $this->makeListItem( $key, $langlink ); ?>
-
- <?php
-}
- ?>
- </ul>
-
- <?php $this->renderAfterPortlet( 'lang' ); ?>
- </div>
- </div>
- <?php
- }
- }
-
- /*************************************************************************************************/
- /**
- * @param string $bar
- * @param array|string $cont
- */
- function customBox( $bar, $cont ) {
- $portletAttribs = array(
- 'class' => 'generated-sidebar portlet',
- 'id' => Sanitizer::escapeId( "p-$bar" ),
- 'role' => 'navigation'
- );
-
- $tooltip = Linker::titleAttrib( "p-$bar" );
- if ( $tooltip !== false ) {
- $portletAttribs['title'] = $tooltip;
- }
- echo ' ' . Html::openElement( 'div', $portletAttribs );
- $msgObj = wfMessage( $bar );
- ?>
-
- <h3><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $bar ); ?></h3>
- <div class='pBody'>
- <?php
- if ( is_array( $cont ) ) {
- ?>
- <ul>
- <?php
- foreach ( $cont as $key => $val ) {
- ?>
- <?php echo $this->makeListItem( $key, $val ); ?>
-
- <?php
- }
- ?>
- </ul>
- <?php
- } else {
- # allow raw HTML block to be defined by extensions
- print $cont;
- }
-
- $this->renderAfterPortlet( $bar );
- ?>
- </div>
- </div>
- <?php
- }
-} // end of class
+++ /dev/null
-/*
-** MediaWiki 'monobook' style sheet for CSS2-capable browsers.
-** Copyright Gabriel Wicke - http://wikidev.net/
-** License: GPL (http://www.gnu.org/copyleft/gpl.html)
-**
-** Loosely based on http://www.positioniseverything.net/ordered-floats.html by Big John
-** and the Plone 2.0 styles, see http://plone.org/ (Alexander Limi,Joe Geldart & Tom Croucher,
-** Michael Zeltner and Geir Bækholt)
-** All you guys rock :)
-*/
-
-div#column-content {
- width: 100%;
- float: right;
- margin: 0 0 .6em -12.2em;
- padding: 0;
-}
-
-div#content {
- margin: 2.8em 0 0 12.2em;
- padding: 1em;
- position: relative;
- z-index: 2;
-}
-
-div#column-one {
- padding-top: 160px;
-}
-
-/* Hide, but keep accessible for screen-readers */
-#column-one h2 {
- position: absolute;
- top: -9999px;
-}
-
-div#content {
- background: white;
- color: black;
- border: 1px solid #aaa;
- border-right: none;
- line-height: 1.5em;
-}
-
-/* the left column width is specified in class .portlet */
-
-/* Font size:
-** We take advantage of keyword scaling- browsers won't go below 9px
-** More at http://www.w3.org/2003/07/30-font-size
-** http://style.cleverchimp.com/font_size_intervals/altintervals.html
-*/
-
-body {
- font: x-small sans-serif;
- /* @embed */
- background: #f9f9f9 url(headbg.jpg) 0 0 no-repeat;
- color: black;
- margin: 0;
- padding: 0;
- direction: ltr; /* Needed for RTL flipping */
- unicode-bidi: embed;
-}
-
-/* scale back up to a sane default */
-div#globalWrapper {
- font-size: 127%;
- width: 100%;
- margin: 0;
- padding: 0;
-}
-
-/* general styles */
-a {
- color: #002bb8;
-}
-
-a:visited {
- color: #5a3696;
-}
-
-a.new,
-#p-personal a.new {
- color: #cc2200;
-}
-
-ul {
- list-style-type: square;
- /* @embed */
- list-style-image: url(bullet.gif);
-}
-
-input.historysubmit {
- padding: 0 .3em .3em .3em !important;
- font-size: 94%;
- cursor: pointer;
- height: 1.7em !important;
- margin-left: 1.6em;
-}
-
-pre, .mw-code {
- line-height: 1.1em;
-}
-
-#firstHeading {
- padding-top: 0;
-}
-
-/*
-** the main content area
-*/
-
-#siteNotice {
- font-size: 95%;
- padding: 0 0.9em;
-}
-
-#localNotice {
- margin: 0;
-}
-
-#siteNotice p {
- margin: 0;
- padding: 0;
-}
-
-/*
-** classes for special content elements like town boxes
-** intended to be referenced directly from the wiki src
-*/
-
-/*
-** User styles
-*/
-/* table standards */
-table.rimage {
- float: right;
- position: relative;
- margin-left: 1em;
- margin-bottom: 1em;
- text-align: center;
-}
-
-/*
-** edit views etc
-*/
-.special li {
- line-height: 1.4em;
- margin: 0;
- padding: 0;
-}
-
-/*
-** keep the whitespace in front of the ^=, hides rule from konqueror
-** this is css3, the validator doesn't like it when validating as css2
-*/
-#bodyContent a.external {
- /* @embed */
- background: url(external-ltr.png) center right no-repeat;
- padding-right: 13px;
-}
-
-#bodyContent a.external[href ^="https://"],
-.link-https {
- /* @embed */
- background: url(lock_icon.gif) center right no-repeat;
- padding-right: 16px;
-}
-
-#bodyContent a.external[href ^="mailto:"],
-.link-mailto {
- /* @embed */
- background: url(mail_icon.gif) center right no-repeat;
- padding-right: 18px;
-}
-
-#bodyContent a.external[href ^="news:"] {
- /* @embed */
- background: url(news_icon.png) center right no-repeat;
- padding-right: 18px;
-}
-
-#bodyContent a.external[href ^="ftp://"],
-.link-ftp {
- /* @embed */
- background: url(file_icon.gif) center right no-repeat;
- padding-right: 18px;
-}
-
-#bodyContent a.external[href ^="irc://"],
-#bodyContent a.external[href ^="ircs://"],
-.link-irc {
- /* @embed */
- background: url(discussionitem_icon.gif) center right no-repeat;
- padding-right: 18px;
-}
-
-#bodyContent a.external[href $=".ogg"], #bodyContent a.external[href $=".OGG"],
-#bodyContent a.external[href $=".mid"], #bodyContent a.external[href $=".MID"],
-#bodyContent a.external[href $=".midi"], #bodyContent a.external[href $=".MIDI"],
-#bodyContent a.external[href $=".mp3"], #bodyContent a.external[href $=".MP3"],
-#bodyContent a.external[href $=".wav"], #bodyContent a.external[href $=".WAV"],
-#bodyContent a.external[href $=".wma"], #bodyContent a.external[href $=".WMA"],
-.link-audio {
- /* @embed */
- background: url(audio.png) center right no-repeat;
- padding-right: 13px;
-}
-
-#bodyContent a.external[href $=".ogm"], #bodyContent a.external[href $=".OGM"],
-#bodyContent a.external[href $=".avi"], #bodyContent a.external[href $=".AVI"],
-#bodyContent a.external[href $=".mpeg"], #bodyContent a.external[href $=".MPEG"],
-#bodyContent a.external[href $=".mpg"], #bodyContent a.external[href $=".MPG"],
-.link-video {
- /* @embed */
- background: url(video.png) center right no-repeat;
- padding-right: 13px;
-}
-
-#bodyContent a.external[href $=".pdf"], #bodyContent a.external[href $=".PDF"],
-#bodyContent a.external[href *=".pdf#"], #bodyContent a.external[href *=".PDF#"],
-#bodyContent a.external[href *=".pdf?"], #bodyContent a.external[href *=".PDF?"],
-.link-document {
- /* @embed */
- background: url(document.png) center right no-repeat;
- padding-right: 12px;
-}
-
-/* Interwiki Styling */
-#bodyContent a.extiw,
-#bodyContent a.extiw:active {
- color: #36b;
-}
-
-/* External links */
-#bodyContent a.external {
- color: #36b;
-}
-
-/*
-** Structural Elements
-*/
-
-/*
-** general portlet styles (elements in the quickbar)
-*/
-.portlet {
- border: none;
- margin: 0 0 .5em;
- padding: 0;
- float: none;
- width: 11.6em;
- overflow: hidden;
-}
-
-.portlet h3 {
- background: transparent;
- padding: 0 1em 0 .5em;
- display: inline;
- height: 1em;
- text-transform: lowercase;
- font-size: 91%;
- font-weight: normal;
- white-space: nowrap;
-}
-
-.pBody {
- font-size: 95%;
- background-color: white;
- color: black;
- border-collapse: collapse;
- border: 1px solid #aaa;
- padding: 0 .8em .3em .5em;
-}
-
-/* allows .pBody styles to wrap around content added via BaseTemplateAfterPortlet hook */
-.pBody:after {
- content: '';
- clear: both;
- display: block;
-}
-
-.portlet ul {
- line-height: 1.5em;
- font-size: 95%;
-}
-
-.portlet li {
- padding: 0;
- margin: 0;
-}
-
-/*
-** Logo properties
-*/
-
-#p-logo {
- top: 0;
- left: 0;
- position: absolute; /*needed to use z-index */
- z-index: 3;
- height: 155px;
- width: 12em;
- overflow: visible;
-}
-
-#p-logo h3 {
- display: none;
-}
-
-#p-logo a,
-#p-logo a:hover {
- display: block;
- height: 155px;
- width: 12.2em;
- background-repeat: no-repeat;
- background-position: 35% 50% !important;
- text-decoration: none;
-}
-
-/*
-** Search portlet
-*/
-#p-search {
- position: relative;
- z-index: 3;
-}
-
-input.searchButton {
- margin-top: 1px;
- font-size: 95%;
-}
-
-#searchGoButton {
- padding-left: .5em;
- padding-right: .5em;
- font-weight: bold;
-}
-
-#searchInput {
- width: 10.9em;
- margin: 0;
- font-size: 95%;
-}
-
-#p-search .pBody {
- padding: .5em .4em .4em .4em;
- text-align: center;
-}
-
-#p-search #searchform div div {
- margin-top: .4em;
- font-size: 95%;
-}
-
-/*
-** the personal toolbar
-*/
-#p-personal {
- position: absolute;
- left: 0;
- top: 0;
- z-index: 3;
-}
-
-#p-personal {
- width: 100%;
- white-space: nowrap;
- padding: 0;
- margin: 0;
- border: none;
- background: none;
- overflow: visible;
- line-height: 1.2em;
-}
-
-#p-personal h3 {
- display: none;
-}
-
-#p-personal .portlet,
-#p-personal .pBody {
- z-index: 0;
- padding: 0;
- margin: 0;
- border: none;
- overflow: visible;
- background: none;
-}
-
-/* this is the ul contained in the portlet */
-#p-personal ul {
- border: none;
- line-height: 1.4em;
- color: #2f6fab;
- padding: 0 2em 0 3em;
- margin: 0;
- text-align: right;
- list-style-type: none;
- list-style-image: none;
- z-index: 0;
- background: none;
- cursor: default;
-}
-
-#p-personal li {
- z-index: 0;
- border: none;
- padding: 0;
- display: inline;
- color: #2f6fab;
- margin-left: 1em;
- line-height: 1.2em;
- background: none;
-}
-
-#p-personal li a {
- text-decoration: none;
- color: #005896;
- padding-bottom: .2em;
- background: none;
-}
-
-#p-personal li a:hover {
- background-color: white;
- padding-bottom: .2em;
- text-decoration: none;
-}
-
-#p-personal li.active a:hover {
- background-color: transparent;
-}
-
-/* The icon in front of the username / login link */
-li#pt-userpage,
-li#pt-anonuserpage,
-li#pt-login {
- /* @embed */
- background: url(user.gif) top left no-repeat;
- padding-left: 20px;
-}
-
-#p-personal ul {
- text-transform: lowercase;
-}
-
-/* Don't lowercase username or IP addresses (IPv6) */
-li#pt-userpage,
-li#pt-anonuserpage {
- text-transform: none;
-}
-
-#p-personal li.active {
- font-weight: bold;
-}
-
-/*
-** the page-related actions- page/talk, edit etc
-*/
-#p-cactions {
- position: absolute;
- top: 1.3em;
- left: 11.5em;
- margin: 0;
- white-space: nowrap;
- width: 76%;
- line-height: 1.1em;
- overflow: visible;
- background: none;
- border-collapse: collapse;
- padding-left: 1em;
- font-size: 95%;
-}
-
-#p-cactions ul {
- list-style-type: none;
- list-style-image: none;
-}
-
-#p-cactions li {
- display: inline;
- border: 1px solid #aaa;
- border-bottom: none;
- padding: 0 0 1em 0;
- margin: 0 .3em 0 0;
- overflow: visible;
- background: white;
-}
-
-#p-cactions li.selected {
- border-color: #fabd23;
- font-weight: bold;
-}
-
-#p-cactions li a {
- background-color: #fbfbfb;
- color: #002bb8;
- border: none;
- padding: 0 .8em .3em;
- position: relative;
- z-index: 0;
- margin: 0;
- text-decoration: none;
-}
-
-#p-cactions li.selected a {
- z-index: 3;
- background-color: white;
-}
-
-#p-cactions .new a {
- color: #ba0000;
-}
-
-#p-cactions li a:hover {
- z-index: 3;
- text-decoration: none;
- background-color: white;
-}
-
-#p-cactions h3 {
- display: none;
-}
-
-#p-cactions li.istalk {
- margin-right: 0;
-}
-
-#p-cactions li.istalk a {
- padding-right: .5em;
-}
-
-#p-cactions #ca-addsection a {
- padding-left: .4em;
- padding-right: .4em;
-}
-
-/* offsets to distinguish the tab groups */
-li#ca-talk {
- margin-right: 1.6em;
-}
-
-li#ca-watch,
-li#ca-unwatch,
-li#ca-varlang-0,
-li#ca-print {
- margin-left: 1.6em;
-}
-
-#p-cactions .pBody {
- font-size: 1em;
- background-color: transparent;
- color: inherit;
- border-collapse: inherit;
- border: 0;
- padding: 0;
-}
-
-#p-cactions li a {
- text-transform: lowercase;
-}
-
-#p-lang {
- position: relative;
- z-index: 3;
-}
-
-/* Override text-transform on languages where capitalization is significant */
-.capitalize-all-nouns .portlet h3,
-.capitalize-all-nouns #p-personal ul,
-.capitalize-all-nouns #p-cactions ul li a {
- text-transform: none;
-}
-
-/* TODO: #t-iscite is only used by the Cite extension, come up with some
- * system which allows extensions to add to this file on the fly
- */
-#t-ispermalink, #t-iscite {
- color: #999;
-}
-
-/*
-** footer
-*/
-div#footer {
- background-color: white;
- border-top: 1px solid #fabd23;
- border-bottom: 1px solid #fabd23;
- margin: .6em 0 1em 0;
- overflow: hidden;
- padding: .4em 0 .3em 0;
- text-align: center;
- font-size: 90%;
-}
-
-div#footer li {
- display: inline;
- margin: 0 1.3em;
-}
-
-#f-poweredbyico, #f-copyrightico {
- margin: 0 8px;
- position: relative;
- top: -2px; /* Bump it up just a tad */
-}
-
-#f-poweredbyico {
- float: right;
- height: 1%;
-}
-
-#f-copyrightico {
- float: left;
- height: 1%;
-}
-
-.mw-htmlform-submit {
- font-weight: bold;
- padding-left: .3em;
- padding-right: .3em;
- margin-right: 2em;
-}
-
-/* js pref toc */
-#preftoc {
- margin: 0;
- padding: 0;
- width: 100%;
- clear: both;
-}
-
-#preftoc li {
- background-color: #f0f0f0;
- color: #000;
-}
-
-#preftoc li {
- margin: 1px -2px 1px 2px;
- float: left;
- padding: 2px 0 3px 0;
- border: 1px solid #fff;
- border-right-color: #716f64;
- border-bottom: 0;
- position: relative;
- white-space: nowrap;
- list-style-type: none;
- list-style-image: none;
- z-index: 3;
-}
-
-#preftoc li.selected {
- font-weight: bold;
- background-color: #f9f9f9;
- border: 1px solid #aaa;
- border-bottom: none;
- cursor: default;
- top: 1px;
- padding-top: 2px;
- margin-right: -3px;
-}
-
-#preftoc > li.selected {
- top: 2px;
-}
-
-#preftoc a,
-#preftoc a:active {
- display: block;
- color: #000;
- padding: 0 .7em;
- position: relative;
- text-decoration: none;
-}
-
-#preftoc li.selected a {
- cursor: default;
- text-decoration: none;
-}
-
-#preferences {
- margin: 0;
- border: 1px solid #aaa;
- clear: both;
- padding: 1.5em;
- background-color: #F9F9F9;
-}
-
-.prefsection {
- border: none;
- padding: 0;
- margin: 0;
-}
-
-.prefsection legend {
- font-weight: bold;
-}
-
-.prefsection table, .prefsection legend {
- background-color: #F9F9F9;
-}
-
-.mainLegend {
- display: none;
-}
-
-td.htmlform-tip {
- font-size: x-small;
- padding: .2em 2em;
- color: #666;
-}
-
-.preferences-login {
- clear: both;
- margin-bottom: 1.5em;
-}
-
-.prefcache {
- font-size: 90%;
- margin-top: 2em;
-}
-
-#userloginprompt, #languagelinks {
- font-size: 85%;
-}
-
-#login-sectiontip {
- font-size: 85%;
- line-height: 1.2;
- padding-top: 2em;
-}
-
-#userloginlink a, #wpLoginattempt, #wpCreateaccount {
- font-weight: bold;
-}
-
-/**
- * This was originally added by Gabriel Wicke in r3681 (committed on 25 May 2004)
- * with the commit message "tweaks to page history".
- * Unlike the other IE/Mac fixes that used to be present here, this seems to get
- * applied on more modern browsers, so let's keep it here until someone has the
- * time to properly test it out.
- */
-#pagehistory li.selected {
- position: relative;
-}
-
-.redirectText {
- font-size: 150%;
- margin: 5px;
-}
-
-div.patrollink {
- clear: both;
-}
-
-.sharedUploadNotice {
- font-style: italic;
-}
-
-span.updatedmarker {
- color: black;
- background-color: #0f0;
-}
-
-.editExternally {
- border: 1px solid gray;
- background-color: #ffffff;
- padding: 3px;
- margin-top: 0.5em;
- float: left;
- font-size: small;
- text-align: center;
-}
-
-.editExternallyHelp {
- font-style: italic;
- color: gray;
-}
-
-.toggle {
- margin-left: 2em;
- text-indent: -2em;
-}
-
-/* @bug 1714 */
-input#wpSave,
-input#wpDiff {
- margin-right: 0.33em;
-}
-
-#wpSave {
- font-weight: bold;
-}
-
-/* noarticletext */
-div.noarticletext {
- border: 1px solid #ccc;
- background: #fff;
- padding: .2em 1em;
- color: #000;
-}
-
-div#searchTargetContainer {
- left: 10px;
- top: 10px;
- width: 90%;
- background: white;
-}
-
-div#searchTarget {
- padding: 3px;
- margin: 5px;
- background: #F0F0F0;
- border: solid 1px blue;
-}
-
-div#searchTarget ul li {
- list-style-type: none;
- list-style-image: none;
-}
-
-div#searchTarget ul li:before {
- color: orange;
- content: "\00BB \0020";
-}
-
-div#searchTargetHide {
- float: right;
- border: solid 1px black;
- background: #DCDCDC;
- padding: 2px;
-}
-
-#powersearch p {
- margin-top: 0;
-}
-
-div.multipageimagenavbox {
- border: solid 1px silver;
- padding: 4px;
- margin: 1em;
- background: #f0f0f0;
-}
-
-div.multipageimagenavbox div.thumb {
- border: none;
- margin-left: 2em;
- margin-right: 2em;
-}
-
-div.multipageimagenavbox hr {
- margin: 6px;
-}
-
-table.multipageimage td {
- text-align: center;
-}
-
-.templatesUsed {
- margin-top: 1.5em;
-}
-
-.mw-summary-preview {
- margin: 0.1em 0;
-}
-
-/* Friendlier slave lag warnings */
-div.mw-lag-warn-normal,
-div.mw-lag-warn-high {
- padding: 3px;
- text-align: center;
- margin: 3px auto;
-}
-
-div.mw-lag-warn-normal {
- border: 1px solid #FFCC66;
- background-color: #FFFFCC;
-}
-
-div.mw-lag-warn-high {
- font-weight: bold;
- border: 2px solid #FF0033;
- background-color: #FFCCCC;
-}
-
-.MediaTransformError {
- background-color: #ccc;
- padding: 0.1em;
-}
-
-.MediaTransformError td {
- text-align: center;
- vertical-align: middle;
- font-size: 90%;
-}
-
-/* God-damned hack for the crappy layout */
-.os-suggest {
- font-size: 127%;
-}
-
-/* Sometimes people don't want personal tools to be lowercase! */
-.no-text-transform {
- text-transform: none;
-}
-
-/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
-.tipsy {
- font-size: 127%;
-}
-
-/* mediawiki.notification */
-.skin-monobook .mw-notification {
- box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
-}
+++ /dev/null
-<?php
-/**
- * Vector - Modern version of MonoBook with fresh look and many usability
- * improvements.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @todo document
- * @file
- * @ingroup Skins
- */
-
-if ( !defined( 'MEDIAWIKI' ) ) {
- die( -1 );
-}
-
-/**
- * SkinTemplate class for Vector skin
- * @ingroup Skins
- */
-class SkinVector extends SkinTemplate {
- public $skinname = 'vector';
- public $stylename = 'vector';
- public $template = 'VectorTemplate';
-
- protected static $bodyClasses = array( 'vector-animateLayout' );
-
- /**
- * Initializes output page and sets up skin-specific parameters
- * @param OutputPage $out Object to initialize
- */
- public function initPage( OutputPage $out ) {
- global $wgLocalStylePath;
-
- parent::initPage( $out );
-
- // Append CSS which includes IE only behavior fixes for hover support -
- // this is better than including this in a CSS file since it doesn't
- // wait for the CSS file to load before fetching the HTC file.
- $min = $this->getRequest()->getFuzzyBool( 'debug' ) ? '' : '.min';
- $out->addHeadItem( 'csshover',
- '<!--[if lt IE 7]><style type="text/css">body{behavior:url("' .
- htmlspecialchars( $wgLocalStylePath ) .
- "/{$this->stylename}/csshover{$min}.htc\")}</style><![endif]-->"
- );
-
- $out->addModules( array( 'skins.vector.js' ) );
- }
-
- /**
- * Loads skin and user CSS files.
- * @param OutputPage $out
- */
- function setupSkinUserCss( OutputPage $out ) {
- parent::setupSkinUserCss( $out );
-
- $styles = array( 'mediawiki.skinning.interface', 'skins.vector.styles' );
- wfRunHooks( 'SkinVectorStyleModules', array( $this, &$styles ) );
- $out->addModuleStyles( $styles );
- }
-
- /**
- * Adds classes to the body element.
- *
- * @param OutputPage $out
- * @param array &$bodyAttrs Array of attributes that will be set on the body element
- */
- function addToBodyAttributes( $out, &$bodyAttrs ) {
- if ( isset( $bodyAttrs['class'] ) && strlen( $bodyAttrs['class'] ) > 0 ) {
- $bodyAttrs['class'] .= ' ' . implode( ' ', static::$bodyClasses );
- } else {
- $bodyAttrs['class'] = implode( ' ', static::$bodyClasses );
- }
- }
-}
-
-/**
- * QuickTemplate class for Vector skin
- * @ingroup Skins
- */
-class VectorTemplate extends BaseTemplate {
- /* Functions */
-
- /**
- * Outputs the entire contents of the (X)HTML page
- */
- public function execute() {
- global $wgVectorUseIconWatch;
-
- // Build additional attributes for navigation urls
- $nav = $this->data['content_navigation'];
-
- if ( $wgVectorUseIconWatch ) {
- $mode = $this->getSkin()->getUser()->isWatched( $this->getSkin()->getRelevantTitle() )
- ? 'unwatch'
- : 'watch';
-
- if ( isset( $nav['actions'][$mode] ) ) {
- $nav['views'][$mode] = $nav['actions'][$mode];
- $nav['views'][$mode]['class'] = rtrim( 'icon ' . $nav['views'][$mode]['class'], ' ' );
- $nav['views'][$mode]['primary'] = true;
- unset( $nav['actions'][$mode] );
- }
- }
-
- $xmlID = '';
- foreach ( $nav as $section => $links ) {
- foreach ( $links as $key => $link ) {
- if ( $section == 'views' && !( isset( $link['primary'] ) && $link['primary'] ) ) {
- $link['class'] = rtrim( 'collapsible ' . $link['class'], ' ' );
- }
-
- $xmlID = isset( $link['id'] ) ? $link['id'] : 'ca-' . $xmlID;
- $nav[$section][$key]['attributes'] =
- ' id="' . Sanitizer::escapeId( $xmlID ) . '"';
- if ( $link['class'] ) {
- $nav[$section][$key]['attributes'] .=
- ' class="' . htmlspecialchars( $link['class'] ) . '"';
- unset( $nav[$section][$key]['class'] );
- }
- if ( isset( $link['tooltiponly'] ) && $link['tooltiponly'] ) {
- $nav[$section][$key]['key'] =
- Linker::tooltip( $xmlID );
- } else {
- $nav[$section][$key]['key'] =
- Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( $xmlID ) );
- }
- }
- }
- $this->data['namespace_urls'] = $nav['namespaces'];
- $this->data['view_urls'] = $nav['views'];
- $this->data['action_urls'] = $nav['actions'];
- $this->data['variant_urls'] = $nav['variants'];
-
- // Reverse horizontally rendered navigation elements
- if ( $this->data['rtl'] ) {
- $this->data['view_urls'] =
- array_reverse( $this->data['view_urls'] );
- $this->data['namespace_urls'] =
- array_reverse( $this->data['namespace_urls'] );
- $this->data['personal_urls'] =
- array_reverse( $this->data['personal_urls'] );
- }
- // Output HTML Page
- $this->html( 'headelement' );
- ?>
- <div id="mw-page-base" class="noprint"></div>
- <div id="mw-head-base" class="noprint"></div>
- <div id="content" class="mw-body" role="main">
- <a id="top"></a>
-
- <?php
- if ( $this->data['sitenotice'] ) {
- ?>
- <div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
- <?php
- }
- ?>
- <h1 id="firstHeading" class="firstHeading" lang="<?php
- $this->data['pageLanguage'] =
- $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
- $this->text( 'pageLanguage' );
- ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
- <?php $this->html( 'prebodyhtml' ) ?>
- <div id="bodyContent" class="mw-body-content">
- <?php
- if ( $this->data['isarticle'] ) {
- ?>
- <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
- <?php
- }
- ?>
- <div id="contentSub"<?php
- $this->html( 'userlangattributes' )
- ?>><?php $this->html( 'subtitle' ) ?></div>
- <?php
- if ( $this->data['undelete'] ) {
- ?>
- <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
- <?php
- }
- ?>
- <?php
- if ( $this->data['newtalk'] ) {
- ?>
- <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
- <?php
- }
- ?>
- <div id="jump-to-nav" class="mw-jump">
- <?php $this->msg( 'jumpto' ) ?>
- <a href="#mw-navigation"><?php
- $this->msg( 'jumptonavigation' )
- ?></a><?php
- $this->msg( 'comma-separator' )
- ?>
- <a href="#p-search"><?php $this->msg( 'jumptosearch' ) ?></a>
- </div>
- <?php $this->html( 'bodycontent' ) ?>
- <?php
- if ( $this->data['printfooter'] ) {
- ?>
- <div class="printfooter">
- <?php $this->html( 'printfooter' ); ?>
- </div>
- <?php
- }
- ?>
- <?php
- if ( $this->data['catlinks'] ) {
- ?>
- <?php
- $this->html( 'catlinks' );
- ?>
- <?php
- }
- ?>
- <?php
- if ( $this->data['dataAfterContent'] ) {
- ?>
- <?php
- $this->html( 'dataAfterContent' );
- ?>
- <?php
- }
- ?>
- <div class="visualClear"></div>
- <?php $this->html( 'debughtml' ); ?>
- </div>
- </div>
- <div id="mw-navigation">
- <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
-
- <div id="mw-head">
- <?php $this->renderNavigation( 'PERSONAL' ); ?>
- <div id="left-navigation">
- <?php $this->renderNavigation( array( 'NAMESPACES', 'VARIANTS' ) ); ?>
- </div>
- <div id="right-navigation">
- <?php $this->renderNavigation( array( 'VIEWS', 'ACTIONS', 'SEARCH' ) ); ?>
- </div>
- </div>
- <div id="mw-panel">
- <div id="p-logo" role="banner"><a style="background-image: url(<?php
- $this->text( 'logopath' )
- ?>);" href="<?php
- echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] )
- ?>" <?php
- echo Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) )
- ?>></a></div>
- <?php $this->renderPortals( $this->data['sidebar'] ); ?>
- </div>
- </div>
- <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
- <?php
- foreach ( $this->getFooterLinks() as $category => $links ) {
- ?>
- <ul id="footer-<?php
- echo $category
- ?>">
- <?php
- foreach ( $links as $link ) {
- ?>
- <li id="footer-<?php
- echo $category
- ?>-<?php
- echo $link
- ?>"><?php
- $this->html( $link )
- ?></li>
- <?php
- }
- ?>
- </ul>
- <?php
- }
- ?>
- <?php $footericons = $this->getFooterIcons( "icononly" );
- if ( count( $footericons ) > 0 ) {
- ?>
- <ul id="footer-icons" class="noprint">
- <?php
- foreach ( $footericons as $blockName => $footerIcons ) {
- ?>
- <li id="footer-<?php
- echo htmlspecialchars( $blockName ); ?>ico">
- <?php
- foreach ( $footerIcons as $icon ) {
- ?>
- <?php
- echo $this->getSkin()->makeFooterIcon( $icon );
- ?>
-
- <?php
- }
- ?>
- </li>
- <?php
- }
- ?>
- </ul>
- <?php
- }
- ?>
- <div style="clear:both"></div>
- </div>
- <?php $this->printTrail(); ?>
-
- </body>
-</html>
- <?php
- }
-
- /**
- * Render a series of portals
- *
- * @param array $portals
- */
- protected function renderPortals( $portals ) {
- // Force the rendering of the following portals
- if ( !isset( $portals['SEARCH'] ) ) {
- $portals['SEARCH'] = true;
- }
- if ( !isset( $portals['TOOLBOX'] ) ) {
- $portals['TOOLBOX'] = true;
- }
- if ( !isset( $portals['LANGUAGES'] ) ) {
- $portals['LANGUAGES'] = true;
- }
- // Render portals
- foreach ( $portals as $name => $content ) {
- if ( $content === false ) {
- continue;
- }
-
- switch ( $name ) {
- case 'SEARCH':
- break;
- case 'TOOLBOX':
- $this->renderPortal( 'tb', $this->getToolbox(), 'toolbox', 'SkinTemplateToolboxEnd' );
- break;
- case 'LANGUAGES':
- if ( $this->data['language_urls'] !== false ) {
- $this->renderPortal( 'lang', $this->data['language_urls'], 'otherlanguages' );
- }
- break;
- default:
- $this->renderPortal( $name, $content );
- break;
- }
- }
- }
-
- /**
- * @param string $name
- * @param array $content
- * @param null|string $msg
- * @param null|string|array $hook
- */
- protected function renderPortal( $name, $content, $msg = null, $hook = null ) {
- if ( $msg === null ) {
- $msg = $name;
- }
- $msgObj = wfMessage( $msg );
- ?>
- <div class="portal" role="navigation" id='<?php
- echo Sanitizer::escapeId( "p-$name" )
- ?>'<?php
- echo Linker::tooltip( 'p-' . $name )
- ?> aria-labelledby='<?php echo Sanitizer::escapeId( "p-$name-label" ) ?>'>
- <h3<?php
- $this->html( 'userlangattributes' )
- ?> id='<?php
- echo Sanitizer::escapeId( "p-$name-label" )
- ?>'><?php
- echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg );
- ?></h3>
-
- <div class="body">
- <?php
- if ( is_array( $content ) ) {
- ?>
- <ul>
- <?php
- foreach ( $content as $key => $val ) {
- ?>
- <?php echo $this->makeListItem( $key, $val ); ?>
-
- <?php
- }
- if ( $hook !== null ) {
- wfRunHooks( $hook, array( &$this, true ) );
- }
- ?>
- </ul>
- <?php
- } else {
- ?>
- <?php
- echo $content; /* Allow raw HTML block to be defined by extensions */
- }
-
- $this->renderAfterPortlet( $name );
- ?>
- </div>
- </div>
- <?php
- }
-
- /**
- * Render one or more navigations elements by name, automatically reveresed
- * when UI is in RTL mode
- *
- * @param array $elements
- */
- protected function renderNavigation( $elements ) {
- global $wgVectorUseSimpleSearch;
-
- // If only one element was given, wrap it in an array, allowing more
- // flexible arguments
- if ( !is_array( $elements ) ) {
- $elements = array( $elements );
- // If there's a series of elements, reverse them when in RTL mode
- } elseif ( $this->data['rtl'] ) {
- $elements = array_reverse( $elements );
- }
- // Render elements
- foreach ( $elements as $name => $element ) {
- switch ( $element ) {
- case 'NAMESPACES':
- ?>
- <div id="p-namespaces" role="navigation" class="vectorTabs<?php
- if ( count( $this->data['namespace_urls'] ) == 0 ) {
- echo ' emptyPortlet';
- }
- ?>" aria-labelledby="p-namespaces-label">
- <h3 id="p-namespaces-label"><?php $this->msg( 'namespaces' ) ?></h3>
- <ul<?php $this->html( 'userlangattributes' ) ?>>
- <?php
- foreach ( $this->data['namespace_urls'] as $link ) {
- ?>
- <li <?php
- echo $link['attributes']
- ?>><span><a href="<?php
- echo htmlspecialchars( $link['href'] )
- ?>" <?php
- echo $link['key']
- ?>><?php
- echo htmlspecialchars( $link['text'] )
- ?></a></span></li>
- <?php
- }
- ?>
- </ul>
- </div>
- <?php
- break;
- case 'VARIANTS':
- ?>
- <div id="p-variants" role="navigation" class="vectorMenu<?php
- if ( count( $this->data['variant_urls'] ) == 0 ) {
- echo ' emptyPortlet';
- }
- ?>" aria-labelledby="p-variants-label">
- <h3 id="mw-vector-current-variant">
- <?php
- foreach ( $this->data['variant_urls'] as $link ) {
- ?>
- <?php
- if ( stripos( $link['attributes'], 'selected' ) !== false ) {
- ?>
- <?php
- echo htmlspecialchars( $link['text'] )
- ?>
- <?php
- }
- ?>
- <?php
- }
- ?>
- </h3>
-
- <h3 id="p-variants-label"><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h3>
-
- <div class="menu">
- <ul>
- <?php
- foreach ( $this->data['variant_urls'] as $link ) {
- ?>
- <li<?php
- echo $link['attributes']
- ?>><a href="<?php
- echo htmlspecialchars( $link['href'] )
- ?>" lang="<?php
- echo htmlspecialchars( $link['lang'] )
- ?>" hreflang="<?php
- echo htmlspecialchars( $link['hreflang'] )
- ?>" <?php
- echo $link['key']
- ?>><?php
- echo htmlspecialchars( $link['text'] )
- ?></a></li>
- <?php
- }
- ?>
- </ul>
- </div>
- </div>
- <?php
- break;
- case 'VIEWS':
- ?>
- <div id="p-views" role="navigation" class="vectorTabs<?php
- if ( count( $this->data['view_urls'] ) == 0 ) {
- echo ' emptyPortlet';
- }
- ?>" aria-labelledby="p-views-label">
- <h3 id="p-views-label"><?php $this->msg( 'views' ) ?></h3>
- <ul<?php
- $this->html( 'userlangattributes' )
- ?>>
- <?php
- foreach ( $this->data['view_urls'] as $link ) {
- ?>
- <li<?php
- echo $link['attributes']
- ?>><span><a href="<?php
- echo htmlspecialchars( $link['href'] )
- ?>" <?php
- echo $link['key']
- ?>><?php
- // $link['text'] can be undefined - bug 27764
- if ( array_key_exists( 'text', $link ) ) {
- echo array_key_exists( 'img', $link )
- ? '<img src="' . $link['img'] . '" alt="' . $link['text'] . '" />'
- : htmlspecialchars( $link['text'] );
- }
- ?></a></span></li>
- <?php
- }
- ?>
- </ul>
- </div>
- <?php
- break;
- case 'ACTIONS':
- ?>
- <div id="p-cactions" role="navigation" class="vectorMenu<?php
- if ( count( $this->data['action_urls'] ) == 0 ) {
- echo ' emptyPortlet';
- }
- ?>" aria-labelledby="p-cactions-label">
- <h3 id="p-cactions-label"><span><?php $this->msg( 'vector-more-actions' ) ?></span><a href="#"></a></h3>
-
- <div class="menu">
- <ul<?php $this->html( 'userlangattributes' ) ?>>
- <?php
- foreach ( $this->data['action_urls'] as $link ) {
- ?>
- <li<?php
- echo $link['attributes']
- ?>>
- <a href="<?php
- echo htmlspecialchars( $link['href'] )
- ?>" <?php
- echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] )
- ?></a>
- </li>
- <?php
- }
- ?>
- </ul>
- </div>
- </div>
- <?php
- break;
- case 'PERSONAL':
- ?>
- <div id="p-personal" role="navigation" class="<?php
- if ( count( $this->data['personal_urls'] ) == 0 ) {
- echo ' emptyPortlet';
- }
- ?>" aria-labelledby="p-personal-label">
- <h3 id="p-personal-label"><?php $this->msg( 'personaltools' ) ?></h3>
- <ul<?php $this->html( 'userlangattributes' ) ?>>
- <?php
- $personalTools = $this->getPersonalTools();
- foreach ( $personalTools as $key => $item ) {
- echo $this->makeListItem( $key, $item );
- }
- ?>
- </ul>
- </div>
- <?php
- break;
- case 'SEARCH':
- ?>
- <div id="p-search" role="search">
- <h3<?php $this->html( 'userlangattributes' ) ?>>
- <label for="searchInput"><?php $this->msg( 'search' ) ?></label>
- </h3>
-
- <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
- <?php
- if ($wgVectorUseSimpleSearch) {
- ?>
- <div id="simpleSearch">
- <?php
- } else {
- ?>
- <div>
- <?php
- }
- ?>
- <?php
- echo $this->makeSearchInput( array( 'id' => 'searchInput' ) );
- echo Html::hidden( 'title', $this->get( 'searchtitle' ) );
- // We construct two buttons (for 'go' and 'fulltext' search modes),
- // but only one will be visible and actionable at a time (they are
- // overlaid on top of each other in CSS).
- // * Browsers will use the 'fulltext' one by default (as it's the
- // first in tree-order), which is desirable when they are unable
- // to show search suggestions (either due to being broken or
- // having JavaScript turned off).
- // * The mediawiki.searchSuggest module, after doing tests for the
- // broken browsers, removes the 'fulltext' button and handles
- // 'fulltext' search itself; this will reveal the 'go' button and
- // cause it to be used.
- echo $this->makeSearchButton(
- 'fulltext',
- array( 'id' => 'mw-searchButton', 'class' => 'searchButton mw-fallbackSearchButton' )
- );
- echo $this->makeSearchButton(
- 'go',
- array( 'id' => 'searchButton', 'class' => 'searchButton' )
- );
- ?>
- </div>
- </form>
- </div>
- <?php
-
- break;
- }
- }
- }
-}
+++ /dev/null
-/**
- * Collapsible tabs jQuery Plugin
- */
-( function ( $ ) {
- var rtl = $( 'html' ).attr( 'dir' ) === 'rtl';
- $.fn.collapsibleTabs = function ( options ) {
- // return if the function is called on an empty jquery object
- if ( !this.length ) {
- return this;
- }
- // Merge options into the defaults
- var settings = $.extend( {}, $.collapsibleTabs.defaults, options );
-
- this.each( function () {
- var $el = $( this );
- // add the element to our array of collapsible managers
- $.collapsibleTabs.instances = ( $.collapsibleTabs.instances.length === 0 ?
- $el : $.collapsibleTabs.instances.add( $el ) );
- // attach the settings to the elements
- $el.data( 'collapsibleTabsSettings', settings );
- // attach data to our collapsible elements
- $el.children( settings.collapsible ).each( function () {
- $.collapsibleTabs.addData( $( this ) );
- } );
- } );
-
- // if we haven't already bound our resize handler, bind it now
- if ( !$.collapsibleTabs.boundEvent ) {
- $( window ).on( 'resize', $.debounce( 500, function () {
- $.collapsibleTabs.handleResize();
- } ) );
- $.collapsibleTabs.boundEvent = true;
- }
-
- // call our resize handler to setup the page
- $.collapsibleTabs.handleResize();
- return this;
- };
- $.collapsibleTabs = {
- instances: [],
- boundEvent: null,
- defaults: {
- expandedContainer: '#p-views ul',
- collapsedContainer: '#p-cactions ul',
- collapsible: 'li.collapsible',
- shifting: false,
- expandCondition: function ( eleWidth ) {
- // If there are at least eleWidth + 1 pixels of free space, expand.
- // We add 1 because .width() will truncate fractional values but .offset() will not.
- return $.collapsibleTabs.calculateTabDistance() >= eleWidth + 1;
- },
- collapseCondition: function () {
- // If there's an overlap, collapse.
- return $.collapsibleTabs.calculateTabDistance() < 0;
- }
- },
- addData: function ( $collapsible ) {
- var settings = $collapsible.parent().data( 'collapsibleTabsSettings' );
- if ( settings ) {
- $collapsible.data( 'collapsibleTabsSettings', {
- expandedContainer: settings.expandedContainer,
- collapsedContainer: settings.collapsedContainer,
- expandedWidth: $collapsible.width(),
- prevElement: $collapsible.prev()
- } );
- }
- },
- getSettings: function ( $collapsible ) {
- var settings = $collapsible.data( 'collapsibleTabsSettings' );
- if ( !settings ) {
- $.collapsibleTabs.addData( $collapsible );
- settings = $collapsible.data( 'collapsibleTabsSettings' );
- }
- return settings;
- },
- handleResize: function () {
- $.collapsibleTabs.instances.each( function () {
- var $el = $( this ),
- data = $.collapsibleTabs.getSettings( $el );
-
- if ( data.shifting ) {
- return;
- }
-
- // if the two navigations are colliding
- if ( $el.children( data.collapsible ).length > 0 && data.collapseCondition() ) {
-
- $el.trigger( 'beforeTabCollapse' );
- // move the element to the dropdown menu
- $.collapsibleTabs.moveToCollapsed( $el.children( data.collapsible + ':last' ) );
- }
-
- // if there are still moveable items in the dropdown menu,
- // and there is sufficient space to place them in the tab container
- if ( $( data.collapsedContainer + ' ' + data.collapsible ).length > 0 &&
- data.expandCondition( $.collapsibleTabs.getSettings( $( data.collapsedContainer ).children(
- data.collapsible + ':first' ) ).expandedWidth ) ) {
- //move the element from the dropdown to the tab
- $el.trigger( 'beforeTabExpand' );
- $.collapsibleTabs
- .moveToExpanded( data.collapsedContainer + ' ' + data.collapsible + ':first' );
- }
- } );
- },
- moveToCollapsed: function ( ele ) {
- var outerData, expContainerSettings, target,
- $moving = $( ele );
-
- outerData = $.collapsibleTabs.getSettings( $moving );
- if ( !outerData ) {
- return;
- }
- expContainerSettings = $.collapsibleTabs.getSettings( $( outerData.expandedContainer ) );
- if ( !expContainerSettings ) {
- return;
- }
- expContainerSettings.shifting = true;
-
- // Remove the element from where it's at and put it in the dropdown menu
- target = outerData.collapsedContainer;
- $moving.css( 'position', 'relative' )
- .css( ( rtl ? 'left' : 'right' ), 0 )
- .animate( { width: '1px' }, 'normal', function () {
- var data, expContainerSettings;
- $( this ).hide();
- // add the placeholder
- $( '<span class="placeholder" style="display: none;"></span>' ).insertAfter( this );
- $( this ).detach().prependTo( target ).data( 'collapsibleTabsSettings', outerData );
- $( this ).attr( 'style', 'display: list-item;' );
- data = $.collapsibleTabs.getSettings( $( ele ) );
- if ( data ) {
- expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
- if ( expContainerSettings ) {
- expContainerSettings.shifting = false;
- $.collapsibleTabs.handleResize();
- }
- }
- } );
- },
- moveToExpanded: function ( ele ) {
- var data, expContainerSettings, $target, expandedWidth,
- $moving = $( ele );
-
- data = $.collapsibleTabs.getSettings( $moving );
- if ( !data ) {
- return;
- }
- expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
- if ( !expContainerSettings ) {
- return;
- }
- expContainerSettings.shifting = true;
-
- // grab the next appearing placeholder so we can use it for replacing
- $target = $( data.expandedContainer ).find( 'span.placeholder:first' );
- expandedWidth = data.expandedWidth;
- $moving.css( 'position', 'relative' ).css( ( rtl ? 'right' : 'left' ), 0 ).css( 'width', '1px' );
- $target.replaceWith(
- $moving
- .detach()
- .css( 'width', '1px' )
- .data( 'collapsibleTabsSettings', data )
- .animate( { width: expandedWidth + 'px' }, 'normal', function () {
- $( this ).attr( 'style', 'display: block;' );
- var data, expContainerSettings;
- data = $.collapsibleTabs.getSettings( $( this ) );
- if ( data ) {
- expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
- if ( expContainerSettings ) {
- expContainerSettings.shifting = false;
- $.collapsibleTabs.handleResize();
- }
- }
- } )
- );
- },
- /**
- * Returns the amount of horizontal distance between the two tabs groups
- * (#left-navigation and #right-navigation), in pixels. If negative, this
- * means that the tabs overlap, and the value is the width of overlapping
- * parts.
- *
- * Used in default expandCondition and collapseCondition.
- *
- * @return {Numeric} distance/overlap in pixels
- */
- calculateTabDistance: function () {
- var $leftTab, $rightTab, leftEnd, rightStart;
-
- // In RTL, #right-navigation is actually on the left and vice versa.
- // Hooray for descriptive naming.
- if ( !rtl ) {
- $leftTab = $( '#left-navigation' );
- $rightTab = $( '#right-navigation' );
- } else {
- $leftTab = $( '#right-navigation' );
- $rightTab = $( '#left-navigation' );
- }
-
- leftEnd = $leftTab.offset().left + $leftTab.width();
- rightStart = $rightTab.offset().left;
-
- return rightStart - leftEnd;
- }
- };
-
-}( jQuery ) );
+++ /dev/null
-/* Animate between standard and high definition layouts */
-body.vector-animateLayout {
- div#content,
- div#footer,
- #left-navigation {
- .transition(margin-left 250ms, padding 250ms;);
- }
-
- #p-logo {
- .transition(left 250ms);
- }
-
- #mw-panel {
- .transition(padding-right 250ms);
- }
-
- #p-search {
- .transition(margin-right 250ms);
- }
-
- #p-personal {
- .transition(right 250ms);
- }
-
- #mw-head-base {
- .transition(margin-left 250ms);
- }
-}
+++ /dev/null
-/*
- * Any rules which should not be flipped automatically in right-to-left situations should be
- * prepended with @noflip in a comment block.
- *
- * This stylesheet employs a few CSS trick to accomplish compatibility with a wide range of web
- * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
- * a rule that makes things work in IE6, and then following it with a rule that begins with
- * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support
- * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and
- * "IGNORED BY IE6" comments.
- */
-@import "mediawiki.mixins";
-
-/* Framework */
-html {
- font-size: @html-font-size;
-}
-html,
-body {
- height: 100%;
- margin: 0;
- padding: 0;
- font-family: @content-font-family;
-}
-body {
- background-color: @menu-background-color;
-}
-
-/* Content */
-div#content {
- margin-left: 10em;
- padding: @content-padding;
- /* Border on top, left, and bottom side */
- border: 1px solid @content-border-color;
- border-right-width: 0;
- /* Merge the border with tabs' one (in their background image) */
- margin-top: -1px;
- background-color: @body-background-color;
- color: @content-font-color;
- direction: ltr;
-
- .mw-editsection,
- .mw-editsection-like {
- font-family: @content-font-family;
- }
-
- p {
- line-height: inherit;
- margin: 0.5em 0;
- }
-
- h1,
- h2,
- #firstHeading {
- font-family: @content-heading-font-family;
- line-height: @heading-line-height;
- margin-bottom: 0.25em;
- padding: 0;
- }
-
- h1,
- #firstHeading {
- font-size: @content-heading-font-size;
- }
-
- h2 {
- font-size: 1.5em;
- margin-top: 1em;
- }
-
- h3,
- h4,
- h5,
- h6 {
- line-height: @content-line-height;
- margin-top: 0.3em;
- margin-bottom: 0;
- padding-bottom: 0;
- }
-
- h3 {
- font-size: 1.17em;
- }
-
- h3,
- h4 {
- font-weight: bold;
- }
-
- h4,
- h5,
- h6 {
- font-size: 100%; /* (reset) */
- }
-
- #toc h2,
- .toc h2 {
- font-size: 100%; /* (reset) */
- font-family: @content-font-family;
- }
-}
-
-/* Hide empty portlets */
-div.emptyPortlet {
- display: none;
-}
-
-ul {
- list-style-type: disc;
- .list-style-image('images/bullet-icon.png');
-}
-
-pre, .mw-code {
- line-height: 1.3em;
-}
-
-/* Site Notice (includes notices from CentralNotice extension) */
-#siteNotice {
- font-size: 0.8em;
-}
-
-.redirectText {
- font-size: 140%;
-}
-
-.redirectMsg img {
- vertical-align: text-bottom;
-}
-
-/* TODO: Remove #bodyContent selector (kept for backwards compatibility with cached html) */
-#bodyContent,
-.mw-body-content {
- position: relative;
- line-height: @content-line-height;
- font-size: @content-font-size;
-}
-
-/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
-// FIXME: Should be part of jquery.tipsy.css
-.tipsy {
- font-size: 0.8em;
-}
+++ /dev/null
-@import "mediawiki.mixins.less";
-// External links
-#content {
- .external {
- background-position: center right;
- background-repeat: no-repeat;
- .background-image-svg('images/external-link-ltr-icon.svg', 'images/external-link-ltr-icon.png');
- padding-right: 13px;
- }
-}
+++ /dev/null
-/* Footer */
-div#footer {
- margin-left: 10em;
- margin-top: 0;
- padding: 0.75em;
- direction: ltr;
-
- ul {
- list-style-type: none;
- list-style-image: none;
- margin: 0;
- padding: 0;
-
- li {
- margin: 0;
- padding: 0;
- padding-top: 0.5em;
- padding-bottom: 0.5em;
- color: #333;
- font-size: 0.7em;
- }
- }
-
- #footer-icons {
- float: right;
-
- li {
- float: left;
- margin-left: 0.5em;
- line-height: 2em;
- text-align: right;
- }
- }
-
- #footer-info {
- li {
- line-height: 1.4em;
- }
- }
-
- #footer-places {
- li {
- float: left;
- margin-right: 1em;
- line-height: 2em;
- }
- }
-}
-
-body.ltr {
- div#footer {
- #footer-places {
- /* @noflip */
- float: left;
- }
- }
-}
+++ /dev/null
-@import "mediawiki.mixins";
-@import "personalMenu";
-@import "search";
-@import "tabs";
-
-/* Hide, but keep accessible for screen-readers */
-#mw-navigation h2 {
- position: absolute;
- top: -9999px;
-}
-
-/* Head */
-#mw-page-base {
- height: 5em;
- background-position: bottom left;
- background-repeat: repeat-x;
- /* This image is only a fallback (for IE 6-9), so we do not @embed it. */
- background-image: url('images/page-fade.png');
- .vertical-gradient(@body-background-color, @menu-background-color, 50%, 100%);
- background-color: @body-background-color;
-}
-
-#mw-head-base {
- margin-top: -5em;
- margin-left: 10em;
- height: 5em;
-}
-
-div#mw-head {
- position: absolute;
- top: 0;
- right: 0;
- width: 100%;
-
- h3 {
- margin: 0;
- padding: 0;
- }
-}
-
-/* Navigation Containers */
-#left-navigation {
- float: left;
- margin-left: 10em;
- margin-top: 2.5em;
- /* When right nav would overlap left nav, it's placed below it
- (normal CSS floats behavior). This rule ensures that no empty space
- is shown between them due to right nav's margin-top. Page layout
- is still broken, but at least the nav overlaps only the page title
- instead of half the content. */
- margin-bottom: -2.5em;
- /* IE 6 double-margin bug fix */
- display: inline;
-}
-
-#right-navigation {
- float: right;
- margin-top: 2.5em;
-}
-
-/* Logo */
-#p-logo {
- position: absolute;
- top: -160px;
- left: 0;
- width: 10em;
- height: 160px;
-
- a {
- display: block;
- width: 10em;
- height: 160px;
- background-repeat: no-repeat;
- background-position: center center;
- text-decoration: none;
- }
-}
-
-/* Panel */
-div#mw-panel {
- font-size: @menu-main-font-size;
- position: absolute;
- top: 160px;
- padding-top: 1em;
- width: 10em;
- left: 0;
-
- div.portal {
- margin: 0 0.6em 0 0.7em;
- padding: 0.25em 0;
- direction: ltr;
- background-position: top left;
- background-repeat: no-repeat;
- .background-image('images/portal-break.png');
-
- h3 {
- font-size: @menu-main-heading-font-size;
- color: @menu-main-heading-color;
- font-weight: normal;
- margin: 0;
- padding: @menu-main-heading-padding;
- cursor: default;
- border: none;
- }
-
- div.body {
- margin: @menu-main-body-margin;
- padding-top: 0;
-
- ul {
- list-style-type: none;
- list-style-image: none;
- margin: 0;
- padding: @menu-main-body-padding;
-
- li {
- line-height: 1.125em;
- margin: 0;
- padding: 0.25em 0;
- font-size: @menu-main-body-font-size;
- word-wrap: break-word;
-
- a {
- color: @menu-main-body-link-color;
- &:visited {
- color: @menu-main-body-link-visited-color;
- }
- }
- }
- }
- }
-
- &.first {
- background-image: none;
- margin-top: 0;
- h3 {
- display: none;
- }
- div.body {
- margin-left: 0.5em;
- }
- }
- }
-}
+++ /dev/null
-/* mediawiki.notification */
-.skin-vector {
- .mw-notification-area {
- font-size: 0.8em;
- }
-
- .mw-notification-area-layout {
- top: 7em;
- }
-
- .mw-notification {
- background-color: #fff;
- background-color: rgba(255, 255, 255, 0.93);
- padding: 0.75em 1.5em;
- border: solid 1px @content-border-color;
- border-radius: 0.75em;
- box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
- }
-}
+++ /dev/null
-/* Personal */
-#p-personal {
- position: absolute;
- top: 0.33em;
- right: 0.75em;
- /* Display on top of page tabs - bugs 37158, 48078 */
- z-index: 100;
-
- h3 {
- display: none;
- }
-
- ul {
- list-style-type: none;
- list-style-image: none;
- margin: 0;
- padding-left: 10em; /* Keep from overlapping logo */
- }
-
- li {
- line-height: 1.125em;
- /* @noflip */
- float: left;
- margin-left: 0.75em;
- margin-top: 0.5em;
- font-size: @menu-personal-font-size;
- white-space: nowrap;
- }
-}
-
-/* Icon for Usernames */
-#pt-userpage,
-#pt-anonuserpage,
-#pt-login {
- background-position: left top;
- background-repeat: no-repeat;
- /* SVG support using a transparent gradient to guarantee cross-browser
- * compatibility (browsers able to understand gradient syntax support also SVG) */
- .background-image-svg('images/user-icon.svg', 'images/user-icon.png');
- padding-left: 15px !important;
-}
+++ /dev/null
-/* Search */
-#p-search {
- /* @noflip */
- float: left;
- margin-right: 0.5em;
- margin-left: 0.5em;
-
- h3 {
- display: none;
- }
-
- form,
- input {
- margin: 0;
- margin-top: 0.4em;
- }
-}
-
-div#simpleSearch {
- display: block;
- width: 14em;
- height: 1.4em;
- margin-top: 0.65em;
- position: relative;
- min-height: 1px; /* Gotta trigger hasLayout for IE7 */
- border: solid 1px #aaa;
- color: black;
- background-color: white;
- .background-image('images/search-fade.png');
- background-position: top left;
- background-repeat: repeat-x;
-
- // Styles for both the search input and the button
- input {
- position: absolute;
- margin: 0;
- padding: 0;
- border: 0;
- background-color: transparent;
- color: black;
- }
-
- // The search input
- #searchInput {
- top: 0;
- left: 0;
- width: 90%;
- padding: 0.2em 0 0.2em 0.2em;
- font-size: 13px;
- direction: ltr;
-
- &:focus {
- outline: none;
- }
-
- // These rules MAY NOT be merged because of how CSS requires browsers
- // to parse unrecognized selectors!
- // Note these rules ensure that placeholder text can be distinguished from
- // standard text. In browsers which make this distinction clear these rules
- // are not necessary.
- // For inputs that use jquery.placeholder.js e.g. IE9-
- &.placeholder {
- color: #999;
- }
- // Distinguish placeholder text in IE10+
- &:-ms-input-placeholder {
- color: #999;
- }
- // Distinguish placeholder text in Firefox 18-
- &:-moz-placeholder {
- color: #999;
- }
-
- // Undo the styles Webkit browsers apply to type=search fields,
- // we provide our own
- -webkit-appearance: textfield;
-
- &::-webkit-search-decoration,
- &::-webkit-search-cancel-button,
- &::-webkit-search-results-button,
- &::-webkit-search-results-decoration {
- -webkit-appearance: textfield;
- }
- }
-
- // The buttons. They are displayed in the same position, and if both are
- // present the fulltext search one obscures the 'Go' one.
- #searchButton,
- #mw-searchButton {
- top: 0;
- right: 0;
- width: 10%;
- height: 100%;
- cursor: pointer;
- /* Hide button text and replace it with the image. */
- /* This would be 100% if not for Firefox shenanigans (bug 60900). */
- text-indent: 200%;
- /* Needed to make IE6 respect the text-indent. */
- line-height: 1;
- /* Opera 12 on RTL flips the text in a funny way without this. */
- /* @noflip */
- direction: ltr;
- white-space: nowrap;
- overflow: hidden;
- .background-image-svg('images/search-ltr.svg', 'images/search-ltr.png');
- background-position: center center;
- background-repeat: no-repeat;
- }
-
- #mw-searchButton {
- z-index: 1;
- }
-}
+++ /dev/null
-/*
-Styling for namespace tabs (page, discussion) and views (read, edit, view history, watch and other actions)
-*/
-
-/* Navigation Labels */
-div.vectorTabs h3 {
- display: none;
-}
-
-/* Namespaces and Views */
-div.vectorTabs {
- /* @noflip */
- float: left;
- height: 2.5em;
- .background-image('images/tab-break.png');
- background-position: bottom left;
- background-repeat: no-repeat;
- padding-left: 1px;
-
- ul {
- /* @noflip */
- float: left;
- height: 100%;
- list-style-type: none;
- list-style-image: none;
- margin: 0;
- padding: 0;
- .background-image('images/tab-break.png');
- background-position: right bottom;
- background-repeat: no-repeat;
-
- li {
- /* @noflip */
- float: left;
- line-height: 1.125em;
- /* For IE6, overridden later to display:block by modern browsers */
- display: inline-block;
- height: 100%;
- margin: 0;
- padding: 0;
- background-color: #f3f3f3;
- .background-image('images/tab-normal-fade.png');
- background-position: bottom left;
- background-repeat: repeat-x;
- white-space: nowrap;
- }
-
- /* IGNORED BY IE6 which doesn't support child selector */
- > li {
- display: block;
- }
- }
-
- li {
- &.new {
- a,
- a:visited{
- color: #a55858;
- }
- }
-
- &.selected {
- .background-image('images/tab-current-fade.png');
- a,
- a:visited{
- color: #333;
- text-decoration: none;
- }
- }
-
- &.icon {
- a {
- background-position: bottom right;
- background-repeat: no-repeat;
- }
- }
-
- a {
- /* For IE6, overridden later to display:block by modern browsers */
- display: inline-block;
- height: 1.9em;
- padding-left: 0.5em;
- padding-right: 0.5em;
- color: @menu-link-color;
- cursor: pointer;
- font-size: 0.8em;
- }
-
- /* Ignored by IE6 which doesn't support child selector */
- > a {
- display: block;
- }
- }
-
- span {
- display: inline-block;
- .background-image('images/tab-break.png');
- background-position: bottom right;
- background-repeat: no-repeat;
-
- a {
- /* For IE6, overridden later to display:block by modern browsers */
- display: inline-block;
- padding-top: 1.25em;
- }
-
- /* Ignored by IE6 which doesn't support child selector */
- > a {
- /* @noflip */
- float: left;
- display: block;
- }
- }
-}
-
-/* Variants and Actions */
-div.vectorMenu {
- /* @noflip */
- direction: ltr;
- /* @noflip */
- float: left;
- cursor: pointer;
- position: relative;
-}
-
-body.rtl div.vectorMenu {
- /* @noflip */
- direction: rtl;
-}
-
-div#mw-head div.vectorMenu h3 {
- /* @noflip */
- float: left;
- .background-image('images/tab-break.png');
- background-repeat: no-repeat;
- background-position: bottom right;
- margin-left: -1px;
- font-size: 1em;
- height: 2.5em;
- // This effectively moves the "background border" outside of the element to act like a real
- // border. It is necessary for the dropdown (div.vectorMenu div.menu) to align well.
- padding-right: 1px;
- margin-right: -1px;
-}
-
-// The "Variants" menu has a really funny structure
-div#mw-head div.vectorMenu#p-variants {
- #p-variants-label span {
- display: none;
- }
-
- #mw-vector-current-variant {
- display: inline-block;
- float: left;
- padding-right: 20px;
- font-size: 0.8em;
- padding-left: 0.5em;
- padding-top: 1.375em;
- font-weight: normal;
- border: none;
- background-image: none;
- }
-}
-
-div.vectorMenu h3 span {
- display: block;
- font-size: 0.8em;
- padding-left: 0.7em;
- padding-top: 1.375em;
- margin-right: 20px;
- font-weight: normal;
- color: @menu-main-heading-color;
-}
-
-div.vectorMenu h3 a {
- position: absolute;
- top: 0;
- right: 0;
- width: 20px;
- height: 2.5em;
- .background-image-svg('images/arrow-down-icon.svg', 'images/arrow-down-icon.png');
- background-position: 100% 70%;
- background-repeat: no-repeat;
- .transition(background-position 250ms);
-}
-
-div.vectorMenu.menuForceShow h3 a {
- background-position: 100% 100%;
-}
-
-div.vectorMenuFocus h3 a {
- .background-image-svg('images/arrow-down-focus-icon.svg', 'images/arrow-down-focus-icon.png');
-}
-
-div.vectorMenu div.menu {
- // Match the width of the dropdown "heading" (the tab)
- min-width: 100%;
- position: absolute;
- top: 2.5em;
- left: -1px;
- background-color: white;
- border: solid 1px silver;
- border-top-width: 0;
- clear: both;
- text-align: left;
- display: none;
-}
-
-/* Enable forcing showing of the menu for accessibility */
-div.vectorMenu:hover div.menu,
-div.vectorMenu.menuForceShow div.menu {
- display: block;
-}
-
-div.vectorMenu ul {
- list-style-type: none;
- list-style-image: none;
- padding: 0;
- margin: 0;
- text-align: left;
-}
-
-/* Fixes old versions of FireFox */
-div.vectorMenu ul,
-x:-moz-any-link {
- min-width: 5em;
-}
-
-/* Returns things back to normal in modern versions of FireFox */
-div.vectorMenu ul,
-x:-moz-any-link,
-x:default {
- min-width: 0;
-}
-
-div.vectorMenu li {
- padding: 0;
- margin: 0;
- text-align: left;
- line-height: 1em;
-}
-
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorMenu li a {
- display: inline-block;
- padding: 0.5em;
- white-space: nowrap;
- color: @menu-link-color;
- cursor: pointer;
- font-size: 0.8em;
-}
-
-/* IGNORED BY IE6 */
-div.vectorMenu li > a {
- display: block;
-}
-
-div.vectorMenu li.selected a,
-div.vectorMenu li.selected a:visited {
- color: #333;
- text-decoration: none;
-}
-
-@import 'watchstar.less';
+++ /dev/null
-@import "mediawiki.mixins.rotation"
-
-/* Watch/Unwatch Icon Styling */
-#ca-unwatch.icon a,
-#ca-watch.icon a {
- margin: 0;
- padding: 0;
- display: block;
- width: 26px;
- /* This hides the text but shows the background image */
- padding-top: 3.1em;
- margin-top: 0;
- /* Only applied in IE6 */
- margin-top: -0.8em !ie;
- height: 0;
- overflow: hidden;
- background-position: 5px 60%;
-}
-#ca-unwatch.icon a {
- .background-image-svg('images/unwatch-icon.svg', 'images/unwatch-icon.png');
-}
-#ca-watch.icon a {
- .background-image-svg('images/watch-icon.svg', 'images/watch-icon.png');
-}
-#ca-unwatch.icon a:hover,
-#ca-unwatch.icon a:focus {
- .background-image-svg('images/unwatch-icon-hl.svg', 'images/unwatch-icon-hl.png');
-}
-#ca-watch.icon a:hover,
-#ca-watch.icon a:focus {
- .background-image-svg('images/watch-icon-hl.svg', 'images/watch-icon-hl.png');
-}
-#ca-unwatch.icon a.loading,
-#ca-watch.icon a.loading {
- .background-image-svg('images/watch-icon-loading.svg', 'images/watch-icon-loading.png');
- .rotation(700ms);
- /* Suppress the hilarious rotating focus outline on Firefox */
- outline: none;
- cursor: default;
- pointer-events: none;
- background-position: 50% 60%;
- -webkit-transform-origin: 50% 57%;
- transform-origin: 50% 57%;
-}
-#ca-unwatch.icon a span,
-#ca-watch.icon a span {
- display: none;
-}
+++ /dev/null
-<public:attach event="ondocumentready" onevent="CSSHover()" />
-<script>
-/**
- * Whatever:hover - V3.11
- * ------------------------------------------------------------
- * Author - Peter Nederlof, http://www.xs4all.nl/~peterned
- * License - http://creativecommons.org/licenses/LGPL/2.1
- *
- * Special thanks to Sergiu Dumitriu, http://purl.org/net/sergiu,
- * for fixing the expression loop.
- *
- * Whatever:hover is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * Whatever:hover is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * howto: body { behavior:url("csshover3.htc"); }
- * ------------------------------------------------------------
- */
-
-window.CSSHover = (function(){
-
- // regular expressions, used and explained later on.
- var REG_INTERACTIVE = /(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;
- var REG_AFFECTED = /(.*?)\:(hover|active|focus)/i;
- var REG_PSEUDO = /[^:]+:([a-z\-]+).*/i;
- var REG_SELECT = /(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;
- var REG_CLASS = /\.([a-z0-9_\-]*on(hover|active|focus))/i;
- var REG_MSIE = /msie (5|6|7)/i;
- var REG_COMPAT = /backcompat/i;
-
- // property mapping, real css properties must be used in order to clear expressions later on...
- // Uses obscure css properties that no-one is likely to use. The properties are borrowed to
- // set an expression, and are then restored to the most likely correct value.
- var Properties = {
- index: 0,
- list: ['text-kashida', 'text-kashida-space', 'text-justify'],
- get: function() {
- return this.list[(this.index++)%this.list.length];
- }
- };
-
- // camelize is used to convert css properties from (eg) text-kashida to textKashida
- var camelize = function(str) {
- return str.replace(/-(.)/mg, function(result, match){
- return match.toUpperCase();
- });
- };
-
- /**
- * Local CSSHover object
- * --------------------------
- */
-
- var CSSHover = {
-
- // array of CSSHoverElements, used to unload created events
- elements: [],
-
- // buffer used for checking on duplicate expressions
- callbacks: {},
-
- // init, called once ondomcontentready via the exposed window.CSSHover function
- init:function() {
- // don't run in IE8 standards; expressions don't work in standards mode anyway,
- // and the stuff we're trying to fix should already work properly
- if(!REG_MSIE.test(navigator.userAgent) && !REG_COMPAT.test(window.document.compatMode)) {
- return;
- }
-
- // start parsing the existing stylesheets
- var sheets = window.document.styleSheets, l = sheets.length;
- for(var i=0; i<l; i++) {
- this.parseStylesheet(sheets[i]);
- }
- },
-
- // called from init, parses individual stylesheets
- parseStylesheet:function(sheet) {
- // check sheet imports and parse those recursively
- if(sheet.imports) {
- try {
- var imports = sheet.imports;
- var l = imports.length;
- for(var i=0; i<l; i++) {
- this.parseStylesheet(sheet.imports[i]);
- }
- } catch(securityException){
- // trycatch for various possible errors
- }
- }
-
- // interate the sheet's rules and send them to the parser
- try {
- var rules = sheet.rules;
- var r = rules.length;
- for(var j=0; j<r; j++) {
- this.parseCSSRule(rules[j], sheet);
- }
- } catch(someException){
- // trycatch for various errors, most likely accessing the sheet's rules.
- }
- },
-
- // magic starts here ...
- parseCSSRule:function(rule, sheet) {
-
- // The sheet is used to insert new rules into, this must be the same sheet the rule
- // came from, to ensure that relative paths keep pointing to the right location.
-
- // only parse a rule if it contains an interactive pseudo.
- var select = rule.selectorText;
- if(REG_INTERACTIVE.test(select)) {
- var style = rule.style.cssText;
-
- // affected elements are found by truncating the selector after the interactive pseudo,
- // eg: "div li:hover" >> "div li"
- var affected = REG_AFFECTED.exec(select)[1];
-
- // that pseudo is needed for a classname, and defines the type of interaction (focus, hover, active)
- // eg: "li:hover" >> "onhover"
- var pseudo = select.replace(REG_PSEUDO, 'on$1');
-
- // the new selector is going to use that classname in a new css rule,
- // since IE6 doesn't support multiple classnames, this is merged into one classname
- // eg: "li:hover" >> "li.onhover", "li.folder:hover" >> "li.folderonhover"
- var newSelect = select.replace(REG_SELECT, '.$2' + pseudo);
-
- // the classname is needed for the events that are going to be set on affected nodes
- // eg: "li.folder:hover" >> "folderonhover"
- var className = REG_CLASS.exec(newSelect)[1];
-
- // no need to set the same callback more than once when the same selector uses the same classname
- var hash = affected + className;
- if(!this.callbacks[hash]) {
-
- // affected elements are given an expression under a borrowed css property, because fake properties
- // can't have their expressions cleared. Different properties are used per pseudo, to avoid
- // expressions from overwriting eachother. The expression does a callback to CSSHover.patch,
- // rerouted via the exposed window.CSSHover function.
- var property = Properties.get();
- var atRuntime = camelize(property);
-
- // because the expression is added to the stylesheet, and styles are always applied to html that is
- // dynamically added to the dom, the expression will also trigger for those new elements (provided
- // they are selected by the affected selector).
- sheet.addRule(affected, property + ':expression(CSSHover(this, "'+pseudo+'", "'+className+'", "'+atRuntime+'"))');
-
- // hash it, so an identical selector/class combo does not duplicate the expression
- this.callbacks[hash] = true;
- }
-
- // duplicate expressions need not be set, but the style could differ
- sheet.addRule(newSelect, style);
- }
- },
-
- // called via the expression, patches individual nodes
- patch:function(node, type, className, property) {
-
- // restores the borrowed css property to the value of its immediate parent, clearing
- // the expression so that it's not repeatedly called.
- try {
- var value = node.parentNode.currentStyle[property];
- node.style[property] = value;
- } catch(e) {
- // the above reset should never fail, but just in case, clear the runtimeStyle if it does.
- // this will also stop the expression.
- node.runtimeStyle[property] = '';
- }
-
- // just to make sure, also keep track of patched classnames locally on the node
- if(!node.csshover) {
- node.csshover = [];
- }
-
- // and check for it to prevent duplicate events with the same classname from being set
- if(!node.csshover[className]) {
- node.csshover[className] = true;
-
- // create an instance for the given type and class
- var element = new CSSHoverElement(node, type, className);
-
- // and store that instance for unloading later on
- this.elements.push(element);
- }
-
- // returns a dummy value to the expression
- return type;
- },
-
- // unload stuff onbeforeunload
- unload:function() {
- try {
-
- // remove events
- var l = this.elements.length;
- for(var i=0; i<l; i++) {
- this.elements[i].unload();
- }
-
- // and set properties to null
- this.elements = [];
- this.callbacks = {};
-
- } catch (e) {
- }
- }
- };
-
- /**
- * CSSHoverElement
- * --------------------------
- */
-
- // the event types associated with the interactive pseudos
- var CSSEvents = {
- onhover: { activator: 'onmouseenter', deactivator: 'onmouseleave' },
- onactive: { activator: 'onmousedown', deactivator: 'onmouseup' },
- onfocus: { activator: 'onfocus', deactivator: 'onblur' }
- };
-
- // CSSHoverElement constructor, called via CSSHover.patch
- function CSSHoverElement(node, type, className) {
-
- // the CSSHoverElement patches individual nodes by manually applying the events that should
- // have fired by the css pseudoclasses, eg mouseenter and mouseleave for :hover.
-
- this.node = node;
- this.type = type;
- var replacer = new RegExp('(^|\\s)'+className+'(\\s|$)', 'g');
-
- // store event handlers for removal onunload
- this.activator = function(){ node.className += ' ' + className; };
- this.deactivator = function(){ node.className = node.className.replace(replacer, ' '); };
-
- // add the events
- node.attachEvent(CSSEvents[type].activator, this.activator);
- node.attachEvent(CSSEvents[type].deactivator, this.deactivator);
- }
-
- CSSHoverElement.prototype = {
- // onbeforeunload, called via CSSHover.unload
- unload:function() {
-
- // remove events
- this.node.detachEvent(CSSEvents[this.type].activator, this.activator);
- this.node.detachEvent(CSSEvents[this.type].deactivator, this.deactivator);
-
- // and set properties to null
- this.activator = null;
- this.deactivator = null;
- this.node = null;
- this.type = null;
- }
- };
-
- // add the unload to the onbeforeunload event
- window.attachEvent('onbeforeunload', function(){
- CSSHover.unload();
- });
-
- /**
- * Public hook
- * --------------------------
- */
-
- return function(node, type, className, property) {
- if(node) {
- // called via the css expression; patches individual nodes
- return CSSHover.patch(node, type, className, property);
- } else {
- // called ondomcontentready via the public:attach node
- CSSHover.init();
- }
- };
-
-})();
-</script>
\ No newline at end of file
+++ /dev/null
-<public:attach event="ondocumentready" onevent="CSSHover()" />
-<script>
-/**
- * Whatever:hover - V3.11
- * http://www.xs4all.nl/~peterned/
- *
- * Copyright (c) 2009 Peter Nederlof
- * Licensed under the LGPL license
- * http://creativecommons.org/licenses/LGPL/2.1
- */
-window.CSSHover=(function(){var m=/(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;var n=/(.*?)\:(hover|active|focus)/i;var o=/[^:]+:([a-z\-]+).*/i;var p=/(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;var q=/\.([a-z0-9_\-]*on(hover|active|focus))/i;var s=/msie (5|6|7)/i;var t=/backcompat/i;var u={index:0,list:['text-kashida','text-kashida-space','text-justify'],get:function(){return this.list[(this.index++)%this.list.length]}};var v=function(c){return c.replace(/-(.)/mg,function(a,b){return b.toUpperCase()})};var w={elements:[],callbacks:{},init:function(){if(!s.test(navigator.userAgent)&&!t.test(window.document.compatMode)){return}var a=window.document.styleSheets,l=a.length;for(var i=0;i<l;i++){this.parseStylesheet(a[i])}},parseStylesheet:function(a){if(a.imports){try{var b=a.imports;var l=b.length;for(var i=0;i<l;i++){this.parseStylesheet(a.imports[i])}}catch(securityException){}}try{var c=a.rules;var r=c.length;for(var j=0;j<r;j++){this.parseCSSRule(c[j],a)}}catch(someException){}},parseCSSRule:function(a,b){var c=a.selectorText;if(m.test(c)){var d=a.style.cssText;var e=n.exec(c)[1];var f=c.replace(o,'on$1');var g=c.replace(p,'.$2'+f);var h=q.exec(g)[1];var i=e+h;if(!this.callbacks[i]){var j=u.get();var k=v(j);b.addRule(e,j+':expression(CSSHover(this, "'+f+'", "'+h+'", "'+k+'"))');this.callbacks[i]=true}b.addRule(g,d)}},patch:function(a,b,c,d){try{var f=a.parentNode.currentStyle[d];a.style[d]=f}catch(e){a.runtimeStyle[d]=''}if(!a.csshover){a.csshover=[]}if(!a.csshover[c]){a.csshover[c]=true;var g=new CSSHoverElement(a,b,c);this.elements.push(g)}return b},unload:function(){try{var l=this.elements.length;for(var i=0;i<l;i++){this.elements[i].unload()}this.elements=[];this.callbacks={}}catch(e){}}};var x={onhover:{activator:'onmouseenter',deactivator:'onmouseleave'},onactive:{activator:'onmousedown',deactivator:'onmouseup'},onfocus:{activator:'onfocus',deactivator:'onblur'}};function CSSHoverElement(a,b,c){this.node=a;this.type=b;var d=new RegExp('(^|\\s)'+c+'(\\s|$)','g');this.activator=function(){a.className+=' '+c};this.deactivator=function(){a.className=a.className.replace(d,' ')};a.attachEvent(x[b].activator,this.activator);a.attachEvent(x[b].deactivator,this.deactivator)}CSSHoverElement.prototype={unload:function(){this.node.detachEvent(x[this.type].activator,this.activator);this.node.detachEvent(x[this.type].deactivator,this.deactivator);this.activator=null;this.deactivator=null;this.node=null;this.type=null}};window.attachEvent('onbeforeunload',function(){w.unload()});return function(a,b,c,d){if(a){return w.patch(a,b,c,d)}else{w.init()}}})();
-</script>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M6.001 2.998l5.001 5-5.001 5z" fill="#797979"/></svg>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M9.999 13.002l-5.001-5 5.001-5z" fill="#797979"/></svg>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="22" height="16"><path d="M15.502 6.001l-5 5.001-5-5.001z" fill="#929292"/></svg>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="22" height="16"><path d="M15.502 6.001l-5 5.001-5-5.001z" fill="#797979"/></svg>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M13.002 6.001l-5 5.001-5-5.001z" fill="#797979"/></svg>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"><g transform="translate(-826.429 -698.791)"><rect width="5.982" height="5.982" x="826.929" y="702.309" fill="#fff" stroke="#06c"/><g><path d="M831.194 698.791h5.234v5.391l-1.571 1.545-1.31-1.31-2.725 2.725-2.689-2.689 2.808-2.808-1.311-1.311z" fill="#06f"/><path d="M835.424 699.795l.022 4.885-1.817-1.817-2.881 2.881-1.228-1.228 2.881-2.881-1.851-1.851z" fill="#fff"/></g></g></svg>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"><g transform="translate(-826.429 -698.791)"><rect width="5.982" height="5.982" x="-835.929" y="702.309" transform="scale(-1 1)" fill="#fff" stroke="#06c"/><g><path d="M831.663 698.791h-5.234v5.391l1.571 1.545 1.31-1.31 2.725 2.725 2.689-2.689-2.808-2.808 1.311-1.311z" fill="#06f"/><path d="M827.433 699.795l-.022 4.885 1.817-1.817 2.881 2.881 1.228-1.228-2.881-2.881 1.851-1.851z" fill="#fff"/></g></g></svg>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#6c6c6c" fill="none"><path d="M11.29 11.71l-4-4"/><circle cx="5" cy="5" r="4"/></g></svg>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#6c6c6c" fill="none"><path d="M.71 11.71l4-4"/><circle cx="7" cy="5" r="4"/></g></svg>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><linearGradient id="a"><stop offset="0" stop-color="#c2edff"/><stop offset=".5" stop-color="#68bdff"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient x1="13.47" y1="14.363" x2="4.596" y2="3.397" id="b" xlink:href="#a" gradientUnits="userSpaceOnUse"/></defs><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="url(#b)" stroke="#c8b250" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><linearGradient id="a"><stop offset="0" stop-color="#c2edff"/><stop offset=".5" stop-color="#68bdff"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient x1="13.47" y1="14.363" x2="4.596" y2="3.397" id="b" xlink:href="#a" gradientUnits="userSpaceOnUse"/></defs><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="url(#b)" stroke="#7cb5d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="12" height="13.837"><defs><linearGradient id="e"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="b"><stop offset="0" stop-color="#3b74bc"/><stop offset="1" stop-color="#2d5990"/></linearGradient><linearGradient id="c"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#c9c9c9"/></linearGradient><linearGradient id="a"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="d"><stop offset="0" stop-color="#f4d9b1"/><stop offset="1" stop-color="#df9725"/></linearGradient><radialGradient cx="31.113" cy="19.009" r="8.662" fx="31.113" fy="19.009" id="f" xlink:href="#a" gradientUnits="userSpaceOnUse"/><radialGradient cx="28.09" cy="27.203" r="13.565" fx="28.09" fy="27.203" id="g" xlink:href="#b" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.298 0 0 .885 -8.359 4.94)"/><linearGradient x1="30.936" y1="29.553" x2="30.936" y2="35.803" id="h" xlink:href="#c" gradientUnits="userSpaceOnUse"/><radialGradient cx="31.113" cy="19.009" r="8.662" fx="31.113" fy="19.009" id="i" xlink:href="#a" gradientUnits="userSpaceOnUse"/><radialGradient cx="29.345" cy="17.064" r="9.162" fx="29.345" fy="17.064" id="j" xlink:href="#d" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.788 0 0 .788 6.221 3.618)"/><linearGradient x1="20.662" y1="35.818" x2="22.627" y2="36.218" id="k" xlink:href="#e" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.983 .182 -.182 .983 6.232 -2.651)"/><linearGradient x1="22.687" y1="36.39" x2="21.408" y2="35.74" id="l" xlink:href="#e" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-.978 .21 .21 .978 55.11 -3.945)"/></defs><g color="#000"><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.693 0 0 .374 -15.548 3.481)" fill="url(#f)" fill-rule="evenodd" overflow="visible"/><path d="M4.046 12.398h4.137c1.172 0 2.332-.43 2.758-1.655.404-1.163.069-3.378-2.551-5.171h-4.895c-2.62 1.655-2.947 3.917-2.344 5.24.614 1.347 1.655 1.586 2.896 1.586z" fill="url(#g)" fill-rule="evenodd" stroke="#204a87" stroke-linecap="round" stroke-linejoin="round" overflow="visible" stroke-width="0.39"/><path d="M4.321 6.193c1.241 1.103 1.793 5.102 1.793 5.102s.552-3.999 1.517-5.171l-3.309.069z" fill="url(#h)" fill-rule="evenodd" overflow="visible"/><path d="M5.21 6.607s-.839.648-.767 1.428c-.796-.702-.819-2.048-.819-2.048l1.586.62z" fill="#729fcf" fill-rule="evenodd" overflow="visible"/><path d="M4.018 11.992l4.092-.009c1.029 0 2.049-.377 2.422-1.453.355-1.022-.037-2.967-2.338-4.542l-4.495-.095c-2.301 1.453-2.747 3.441-2.208 4.697.538 1.256 1.324 1.393 2.526 1.401z" opacity=".215" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" overflow="visible" fill="none" stroke-width="0.39"/><path d="M6.941 6.607s.839.648.767 1.428c.796-.702.819-2.048.819-2.048l-1.586.62z" fill="#729fcf" fill-rule="evenodd" overflow="visible"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.39 0 0 .39 -6.138 -2.475)" fill="url(#i)" fill-rule="evenodd" overflow="visible"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" fill="url(#j)" fill-rule="evenodd" stroke="#c17d11" stroke-linecap="round" stroke-linejoin="round" overflow="visible" transform="matrix(.39 0 0 .39 -6.089 -3.84)"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.342 0 0 .342 -4.598 -2.929)" opacity=".196" stroke="#fff" stroke-width="1.14" stroke-linecap="round" stroke-linejoin="round" overflow="visible" fill="none"/><path d="M2.433 12.062c-.487-.213-.704-.725-.704-.725.328-1.587 1.451-2.748 1.451-2.748s-.889 2.5-.746 3.473z" opacity=".228" fill="url(#k)" fill-rule="evenodd" overflow="visible"/><path d="M9.806 11.728c.48-.227.704-.781.704-.781-.374-1.577-1.551-2.669-1.551-2.669s.961 2.474.847 3.45z" opacity=".228" fill="url(#l)" fill-rule="evenodd" overflow="visible"/></g></svg>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#c8b250" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#d1d1d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#7cb5d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
+++ /dev/null
-/* Vector screen styles for high definition displays */
-
-@import "variables.less";
-
-div#content {
- margin-left: 11em;
- padding: 1.25em 1.5em 1.5em 1.5em;
-}
-#p-logo {
- left: @menu-main-logo-left;
-}
-div#footer {
- margin-left: 11em;
- padding: 1.25em;
-}
-#mw-panel {
- padding-left: 0.5em;
-}
-#p-search {
- margin-right: 1em;
-}
-#left-navigation {
- margin-left: 11em;
-}
-#p-personal {
- right: 1em;
-}
-#mw-head-base {
- margin-left: 11em;
-}
+++ /dev/null
-/* Vector screen styles */
-
-@import "variables.less";
-
-@import "components/common.less";
-@import "components/animations.less";
-@import "components/navigation.less";
-@import "components/footer.less";
-@import 'components/notifications.less';
-@import "components/externalLinks.less";
+++ /dev/null
-/**
- * Adjusts for decreased margin-bottom for h2 elements inside #content div
- * introduced in March / April 2014 typography update.
- */
-table.mw-specialpages-table {
- margin-top: 0;
-}
+++ /dev/null
-@import "mediawiki.mixins";
-@import "variables";
-
-/**
- * The following code is highly modified from monobook. It would be nice if the
- * preftoc id was more human readable like preferences-toc for instance,
- * howerver this would require backporting the other skins.
- */
-
-#preftoc {
- /* Tabs */
- width: 100%;
- float: left;
- clear: both;
- margin: 0 !important;
- padding: 0 !important;
- .background-image('images/preferences/break.png');
- background-position: bottom left;
- background-repeat: no-repeat;
-
- li {
- /* Tab */
- float: left;
- margin: 0;
- padding: 0;
- padding-right: 1px;
- height: 2.25em;
- white-space: nowrap;
- list-style-type: none;
- list-style-image: none;
- .background-image('images/preferences/break.png');
- background-position: bottom right;
- background-repeat: no-repeat;
-
- /* Sadly, IE6 won't understand this */
- &:first-child {
- margin-left: 1px;
- }
-
- &.selected {
- a {
- .background-image('images/preferences/fade.png');
- background-position: bottom;
- background-repeat: repeat-x;
- color: #333;
- text-decoration: none;
- }
- }
- }
-
- a,
- a:active {
- display: inline-block;
- position: relative;
- color: @menu-link-color;
- padding: 0.5em;
- text-decoration: none;
- background-image: none;
- font-size: 0.9em;
- }
-
- a:hover,
- a:focus {
- text-decoration: underline;
- }
-}
-
-#preferences {
- float: left;
- width: 100%;
- margin: 0;
- margin-top: -2px;
- clear: both;
- border: solid 1px #ccc;
- background-color: #fafafa;
-
- fieldset {
- border: none;
- border-top: solid 1px #ccc;
-
- &.prefsection {
- border: none;
- padding: 0;
- margin: 1em;
-
- legend.mainLegend {
- display: none;
- }
- }
- }
-
- legend {
- color: #666;
- }
-
- td {
- padding-left: 0.5em;
- padding-right: 0.5em;
- }
-
- div.mw-prefs-buttons {
- padding: 1em;
-
- input {
- margin-right: 0.25em;
- }
- }
-}
-
-.htmlform-tip {
- font-size: x-small;
- padding: .2em 2em;
- color: #666;
-}
+++ /dev/null
-@html-font-size: 100%;
-
-// Page content
-// FIXME: Use global variable since Echo and CentralNotice use this variable
-@content-border-color: #a7d7f9;
-// FIXME: Find an open font that works with this stack and is readable by Windows users
-@content-font-family: sans-serif;
-@content-font-color: #252525;
-@content-font-size: 0.875em;
-@content-line-height: 1.6;
-@content-padding: 1em;
-@content-heading-font-size: 1.8em;
-@content-heading-font-family: "Linux Libertine", Georgia, Times, serif;
-@body-background-color: #fff;
-@heading-line-height: 1.3;
-
-// Navigation
-@menu-background-color: #f6f6f6;
-
-// Common menu
-@menu-link-color: #0645ad;
-
-// Main menu
-@menu-main-font-size: inherit;
-
-@menu-main-heading-font-size: 0.75em;
-@menu-main-heading-padding: 0.25em 0 0.25em 0.25em;
-@menu-main-heading-color: #4d4d4d;
-
-@menu-main-body-font-size: 0.75em;
-@menu-main-body-link-color: #0645ad;
-@menu-main-body-link-visited-color: #0b0080;
-@menu-main-body-margin: 0 0 0 1.25em;
-@menu-main-body-padding: 0;
-
-@menu-main-logo-left: 0.5em;
-
-// Personal menu
-@menu-personal-font-size: 0.75em;
+++ /dev/null
-/**
- * Vector-specific scripts
- */
-jQuery( function ( $ ) {
- /**
- * Focus search input at the very end
- */
- $( '#searchInput' ).attr( 'tabindex', $( document ).lastTabIndex() + 1 );
-
- /**
- * Dropdown menu accessibility
- */
- $( 'div.vectorMenu' ).each( function () {
- var $el = $( this );
- $el.find( '> h3 > a' ).parent()
- .attr( 'tabindex', '0' )
- // For accessibility, show the menu when the h3 is clicked (bug 24298/46486)
- .on( 'click keypress', function ( e ) {
- if ( e.type === 'click' || e.which === 13 ) {
- $el.toggleClass( 'menuForceShow' );
- e.preventDefault();
- }
- } )
- // When the heading has focus, also set a class that will change the arrow icon
- .focus( function () {
- $el.find( '> a' ).addClass( 'vectorMenuFocus' );
- } )
- .blur( function () {
- $el.find( '> a' ).removeClass( 'vectorMenuFocus' );
- } )
- .find( '> a:first' )
- // As the h3 can already be focused there's no need for the link to be focusable
- .attr( 'tabindex', '-1' );
- } );
-
- /**
- * Sidebar
- */
- $( '#mw-panel > .portal:first' ).addClass( 'first' );
-
- /**
- * Collapsible tabs
- */
- var $cactions = $( '#p-cactions' ),
- $tabContainer = $( '#p-views ul' ),
- originalDropdownWidth = $cactions.width();
-
- // Bind callback functions to animate our drop down menu in and out
- // and then call the collapsibleTabs function on the menu
- $tabContainer
- .bind( 'beforeTabCollapse', function () {
- // If the dropdown was hidden, show it
- if ( $cactions.hasClass( 'emptyPortlet' ) ) {
- $cactions
- .removeClass( 'emptyPortlet' )
- .find( 'h3' )
- .css( 'width', '1px' ).animate( { 'width': originalDropdownWidth }, 'normal' );
- }
- } )
- .bind( 'beforeTabExpand', function () {
- // If we're removing the last child node right now, hide the dropdown
- if ( $cactions.find( 'li' ).length === 1 ) {
- $cactions.find( 'h3' ).animate( { 'width': '1px' }, 'normal', function () {
- $( this ).attr( 'style', '' )
- .parent().addClass( 'emptyPortlet' );
- });
- }
- } )
- .collapsibleTabs( {
- expandCondition: function ( eleWidth ) {
- // (This looks a bit awkward because we're doing expensive queries as late as possible.)
-
- var distance = $.collapsibleTabs.calculateTabDistance();
- // If there are at least eleWidth + 1 pixels of free space, expand.
- // We add 1 because .width() will truncate fractional values but .offset() will not.
- if ( distance >= eleWidth + 1 ) {
- return true;
- } else {
- // Maybe we can still expand? Account for the width of the "Actions" dropdown if the
- // expansion would hide it.
- if ( $cactions.find( 'li' ).length === 1 ) {
- return distance >= eleWidth + 1 - originalDropdownWidth;
- } else {
- return false;
- }
- }
- },
- collapseCondition: function () {
- // (This looks a bit awkward because we're doing expensive queries as late as possible.)
- // TODO The dropdown itself should probably "fold" to just the down-arrow (hiding the text)
- // if it can't fit on the line?
-
- // If there's an overlap, collapse.
- if ( $.collapsibleTabs.calculateTabDistance() < 0 ) {
- // But only if the width of the tab to collapse is smaller than the width of the dropdown
- // we would have to insert. An example language where this happens is Lithuanian (lt).
- if ( $cactions.hasClass( 'emptyPortlet' ) ) {
- return $tabContainer.children( 'li.collapsible:last' ).width() > originalDropdownWidth;
- } else {
- return true;
- }
- } else {
- return false;
- }
- }
- } );
-} );
$this->hooks = array();
$this->functionHooks = array();
+ $this->transparentHooks = array();
self::setUp();
}
$parser->setFunctionHook( $tag, $callback, $flags );
}
+ foreach ( $this->transparentHooks as $tag => $callback ) {
+ $parser->setTransparentTagHook( $tag, $callback );
+ }
+
wfRunHooks( 'ParserTestParser', array( &$parser ) );
return $parser;
return true;
}
+ /**
+ * Steal a callback function from the primary parser, save it for
+ * application to our scary parser. If the hook is not installed,
+ * abort processing of this file.
+ *
+ * @param string $name
+ * @return bool True if function hook is present
+ */
+ public function requireTransparentHook( $name ) {
+ global $wgParser;
+
+ $wgParser->firstCallInit(); // make sure hooks are loaded.
+
+ if ( isset( $wgParser->mTransparentTagHooks[$name] ) ) {
+ $this->transparentHooks[$name] = $wgParser->mTransparentTagHooks[$name];
+ } else {
+ echo " This test suite requires the '$name' transparent hook extension, skipping.\n";
+ return false;
+ }
+
+ return true;
+ }
+
/**
* Run the "tidy" command on text if the $wgUseTidy
* global is true
* interpreted
but rather passed unmodified
{{test}}
+<gallery>
+File:Foobar.jpg
+</gallery>
!! endarticle
# hmm, fix this or just deprecate msgnw and document its behavior?
!! test
msgnw keyword
-!! options
-disabled
!! wikitext
{{msgnw:MSGNW test}}
!! html
-<p>''None'' of '''this''' should be
-* interpreted
- but rather passed unmodified
-{{test}}
+<p>''None'' of '''this''' should be
+* interpreted
+ but rather passed unmodified
+{{test}}
+<gallery>
+File:Foobar.jpg
+</gallery>
</p>
!! end
* See r74778 and bug 25451
* @dataProvider provideOldTimestamps
*/
- public function testOldTimestamps( $input, $format, $output, $desc ) {
- $this->assertEquals( $output, wfTimestamp( $format, $input ), $desc );
+ public function testOldTimestamps( $input, $outputType, $output, $message ) {
+ $timestamp = wfTimestamp( $outputType, $input );
+ if ( substr( $output, 0, 1 ) === '/' ) {
+ // Bug 64946: Day of the week calculations for very old
+ // timestamps varies from system to system.
+ $this->assertRegExp( $output, $timestamp, $message );
+ } else {
+ $this->assertEquals( $output, $timestamp, $message );
+ }
}
public static function provideOldTimestamps() {
array(
'0117-08-09 12:34:56',
TS_RFC2822,
- 'Tue, 09 Aug 0117 12:34:56 GMT',
+ '/, 09 Aug 0117 12:34:56 GMT$/',
'Death of Roman Emperor [[Trajan]]'
),
/* @todo FIXME: 00 to 101 years are taken as being in [1970-2069] */
- array( '-58979923200', TS_RFC2822, 'Sun, 01 Jan 0101 00:00:00 GMT', '1/1/101' ),
+ array( '-58979923200', TS_RFC2822, '/, 01 Jan 0101 00:00:00 GMT$/', '1/1/101' ),
array( '-62135596800', TS_RFC2822, 'Mon, 01 Jan 0001 00:00:00 GMT', 'Year 1' ),
/* It is not clear if we should generate a year 0 or not
class TimeAdjustTest extends MediaWikiLangTestCase {
protected function setUp() {
parent::setUp();
-
- $this->iniSet( 'precision', 15 );
}
/**
$this->setMwGlobals( 'wgLocalTZoffset', $localTZoffset );
$this->assertEquals(
- strval( $expected ),
+ $expected,
strval( $wgContLang->userAdjust( $date, '' ) ),
"User adjust {$date} by {$localTZoffset} minutes should give {$expected}"
);
public static function dataUserAdjust() {
return array(
- array( 20061231235959, 0, 20061231235959 ),
- array( 20061231235959, 5, 20070101000459 ),
- array( 20061231235959, 15, 20070101001459 ),
- array( 20061231235959, 60, 20070101005959 ),
- array( 20061231235959, 90, 20070101012959 ),
- array( 20061231235959, 120, 20070101015959 ),
- array( 20061231235959, 540, 20070101085959 ),
- array( 20061231235959, -5, 20061231235459 ),
- array( 20061231235959, -30, 20061231232959 ),
- array( 20061231235959, -60, 20061231225959 ),
+ array( '20061231235959', 0, '20061231235959' ),
+ array( '20061231235959', 5, '20070101000459' ),
+ array( '20061231235959', 15,'20070101001459' ),
+ array( '20061231235959', 60, '20070101005959' ),
+ array( '20061231235959', 90, '20070101012959' ),
+ array( '20061231235959', 120, '20070101015959' ),
+ array( '20061231235959', 540, '20070101085959' ),
+ array( '20061231235959', -5, '20061231235459' ),
+ array( '20061231235959', -30, '20061231232959' ),
+ array( '20061231235959', -60, '20061231225959' ),
);
}
}
public $savedGlobals = array();
public $hooks = array();
public $functionHooks = array();
+ public $transparentHooks = array();
//Fuzz test
public $maxFuzzTestLength = 300;
return isset( $wgParser->mFunctionHooks[$name] );
}
+ public function requireTransparentHook( $name ) {
+ global $wgParser;
+ $wgParser->firstCallInit(); // make sure hooks are loaded.
+ return isset( $wgParser->mTransparentTagHooks[$name] );
+ }
+
//Various "cleanup" functions
/**
--- /dev/null
+<?php
+class SpecialMIMESearchTest extends MediaWikiTestCase {
+
+ /** @var MIMESearchPage */
+ private $page;
+
+ function setUp() {
+ $this->page = new MIMESearchPage;
+ $context = new RequestContext();
+ $context->setTitle( Title::makeTitle( NS_SPECIAL, 'MIMESearch' ) );
+ $context->setRequest( new FauxRequest() );
+ $this->page->setContext( $context );
+
+ parent::setUp();
+ }
+
+ /**
+ * @dataProvider providerMimeFiltering
+ * @param $par String subpage for special page
+ * @param $major String Major mime type we expect to look for
+ * @param $minor String Minor mime type we expect to look for
+ */
+ function testMimeFiltering( $par, $major, $minor ) {
+ $this->page->run( $par );
+ $qi = $this->page->getQueryInfo();
+ $this->assertEquals( $qi['conds']['img_major_mime'], $major );
+ if ( $minor !== null ) {
+ $this->assertEquals( $qi['conds']['img_minor_mime'], $minor );
+ } else {
+ $this->assertArrayNotHasKey( 'img_minor_mime', $qi['conds'] );
+ }
+ $this->assertContains( 'image', $qi['tables'] );
+ }
+
+ function providerMimeFiltering() {
+ return array(
+ array( 'image/gif', 'image', 'gif' ),
+ array( 'image/png', 'image', 'png' ),
+ array( 'application/pdf', 'application', 'pdf' ),
+ array( 'image/*', 'image', null ),
+ array( 'multipart/*', 'multipart', null ),
+ );
+ }
+}
continue;
}
+ if ( $this->section == 'endtransparenthooks' ) {
+ $this->checkSection( 'transparenthooks' );
+
+ foreach ( explode( "\n", $this->sectionData['transparenthooks'] ) as $line ) {
+ $line = trim( $line );
+
+ if ( $line ) {
+ $delayedParserTest->requireTransparentHook( $line );
+ }
+ }
+
+ $this->clearSection();
+
+ continue;
+ }
+
if ( $this->section == 'end' ) {
$this->checkSection( 'test' );
// "input" and "result" are old section names allowed
/** Initialized on construction */
private $hooks;
private $fnHooks;
+ private $transparentHooks;
public function __construct() {
$this->reset();
public function reset() {
$this->hooks = array();
$this->fnHooks = array();
+ $this->transparentHooks = array();
}
/**
}
}
+ # Trigger delayed transparent hooks. Any failure will make us abort
+ foreach ( $this->transparentHooks as $hook ) {
+ $ret = $parserTest->requireTransparentHook( $hook );
+ if ( !$ret ) {
+ return false;
+ }
+ }
+
# Delayed execution was successful.
return true;
}
$this->fnHooks[] = $fnHook;
}
+ /**
+ * Similar to ParserTest object but does not run anything
+ * Use unleash() to really execute the hook function
+ * @param string $fnHook
+ */
+ public function requireTransparentHook( $hook ) {
+ $this->transparentHooks[] = $hook;
+ }
+
}
/**
* Initialises DjVu tools global with default values
*/
public function __construct() {
- global $wgDjvuRenderer, $wgDjvuDump, $wgDjvuToXML, $wgFileExtensions;
+ global $wgDjvuRenderer, $wgDjvuDump, $wgDjvuToXML, $wgFileExtensions, $wgDjvuTxt;
$wgDjvuRenderer = $wgDjvuRenderer ? $wgDjvuRenderer : '/usr/bin/ddjvu';
$wgDjvuDump = $wgDjvuDump ? $wgDjvuDump : '/usr/bin/djvudump';
$wgDjvuToXML = $wgDjvuToXML ? $wgDjvuToXML : '/usr/bin/djvutoxml';
+ $wgDjvuTxt = $wgDjvuTxt ? $wgDjvuTxt : '/usr/bin/djvutxt';
if ( !in_array( 'djvu', $wgFileExtensions ) ) {
$wgFileExtensions[] = 'djvu';
* @return bool
*/
public function isEnabled() {
- global $wgDjvuRenderer, $wgDjvuDump, $wgDjvuToXML;
+ global $wgDjvuRenderer, $wgDjvuDump, $wgDjvuToXML, $wgDjvuTxt;
return is_executable( $wgDjvuRenderer )
&& is_executable( $wgDjvuDump )
- && is_executable( $wgDjvuToXML );
+ && is_executable( $wgDjvuToXML )
+ && is_executable( $wgDjvuTxt );
}
}